using GemBox.Spreadsheet; using BlackRockReportFunction.Models; using BlackRockReportFunction.Helpers; namespace BlackRockReportFunction.Bussines { internal class ReportGenerator { public const string DefaultFontName = "Calibri"; public const int DefaultFontSize = 20; public static ExcelFile GenerateReportContent(ClockifyReport reportObject) { string licenseKey = Environment.GetEnvironmentVariable("GemBoxLicenseKey"); SpreadsheetInfo.SetLicense(licenseKey); var excelFile = new ExcelFile(); var ws = excelFile.Worksheets.Add("Content"); var sectionStyle = new CellStyle { Font = { Name = DefaultFontName, Weight = ExcelFont.BoldWeight, Size = DefaultFontSize * 12, }, VerticalAlignment = VerticalAlignmentStyle.Center, HorizontalAlignment = HorizontalAlignmentStyle.Left, }; var mainDetailsStyle = new CellStyle { Font = { Name = DefaultFontName, Weight = ExcelFont.BoldWeight, Size = DefaultFontSize * 11, }, VerticalAlignment = VerticalAlignmentStyle.Center, }; var normalDetailsStyle = new CellStyle { Font = { Name = DefaultFontName, Weight = ExcelFont.NormalWeight, Size = DefaultFontSize * 10, }, VerticalAlignment = VerticalAlignmentStyle.Center, }; AddReportItems(reportObject, ws, sectionStyle, mainDetailsStyle, normalDetailsStyle); // Autofit AutoFitReport(excelFile); return excelFile; } public static void AddReportItems(ClockifyReport reportObject, ExcelWorksheet ws, CellStyle sectionStyle, CellStyle mainDetailsStyle, CellStyle normalDetailsStyle) { int row = 0; string[] sectionNames = { "User ", "Description ", "Time (h) ", "Time (decimal) ", "Amount (USD) " }; decimal totalAmountSum = 0; List usersDecimalHours = new List(); for (int i = 0; i < sectionNames.Length; i++) { ws.Cells[row, i].Style = sectionStyle; ws.Cells[row, i].Value = sectionNames[i]; ws.Cells[row, i].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin; ws.Cells[row, i].Style.Borders[IndividualBorder.Bottom].LineStyle = LineStyle.Thick; ws.Cells[row, i].Style.Borders[IndividualBorder.Bottom].LineColor = System.Drawing.Color.LightGray; } row++; foreach (var reportPerson in reportObject.reportPeople) { ws.Cells[row, 0].Style = mainDetailsStyle; ws.Cells[row, 0].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin; ws.Cells[row, 0].Value = reportPerson.fullName; ws.Cells[row, 1].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin; var sumOfRecordHours = Formaters.getSumOfRecordTimes(reportPerson.records.Select(record => record.recordTime).ToList()); ws.Cells[row, 2].Style = mainDetailsStyle; ws.Cells[row, 2].Style.HorizontalAlignment = HorizontalAlignmentStyle.Right; ws.Cells[row, 2].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin; ws.Cells[row, 2].Value = sumOfRecordHours; ws.Cells[row, 3].Style = mainDetailsStyle; ws.Cells[row, 3].Style.HorizontalAlignment = HorizontalAlignmentStyle.Right; ws.Cells[row, 3].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin; var userDecimalHours = Formaters.getDecimalHours(sumOfRecordHours); ws.Cells[row, 3].Value = userDecimalHours; usersDecimalHours.Add(userDecimalHours); ws.Cells[row, 4].Style = mainDetailsStyle; ws.Cells[row, 4].Style.HorizontalAlignment = HorizontalAlignmentStyle.Right; ws.Cells[row, 4].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin; ws.Cells[row, 4].Value = string.Format("{0} USD", reportPerson.records.Sum(record => record.amount).ToString("0.00")); totalAmountSum += reportPerson.records.Sum(record => record.amount); row++; foreach (var personRecord in reportPerson.records) { ws.Cells[row, 0].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin; ws.Cells[row, 1].Style = normalDetailsStyle; ws.Cells[row, 1].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin; ws.Cells[row, 1].Value = personRecord.recordDescription; ws.Cells[row, 2].Style = normalDetailsStyle; ws.Cells[row, 2].Style.HorizontalAlignment = HorizontalAlignmentStyle.Right; ws.Cells[row, 2].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin; ws.Cells[row, 2].Value = Formaters.getRecordTime(personRecord.recordTime); ws.Cells[row, 3].Style = normalDetailsStyle; ws.Cells[row, 3].Style.HorizontalAlignment = HorizontalAlignmentStyle.Right; ws.Cells[row, 3].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin; ws.Cells[row, 3].Value = Formaters.getDecimalHours(personRecord.recordTime); ws.Cells[row, 4].Style = normalDetailsStyle; ws.Cells[row, 4].Style.HorizontalAlignment = HorizontalAlignmentStyle.Right; ws.Cells[row, 4].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin; ws.Cells[row, 4].Value = string.Format("{0} USD", personRecord.amount.ToString("0.00")); row++; } } ws.Cells.GetSubrangeAbsolute(row, 0, row, 1).Merged = true; ws.Cells.GetSubrangeAbsolute(row, 0, row, 1).Style = mainDetailsStyle; ws.Cells.GetSubrangeAbsolute(row, 0, row, 1).Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin; ws.Cells.GetSubrangeAbsolute(row, 0, row, 1).Value = reportObject.reportDescription; var totalSum = Formaters.getTotalSum( reportObject.reportPeople.Select( person => Formaters.getSumOfRecordTimes( person.records.Select(record => record.recordTime).ToList() ) ).ToList() ); ws.Cells[row, 2].Style = mainDetailsStyle; ws.Cells[row, 2].Style.HorizontalAlignment = HorizontalAlignmentStyle.Right; ws.Cells[row, 2].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin; ws.Cells[row, 2].Value = totalSum; ws.Cells[row, 3].Style = mainDetailsStyle; ws.Cells[row, 3].Style.HorizontalAlignment = HorizontalAlignmentStyle.Right; ws.Cells[row, 3].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin; ws.Cells[row, 3].Value = Formaters.getTotalDecimalHours(usersDecimalHours); ws.Cells[row, 4].Style = mainDetailsStyle; ws.Cells[row, 4].Style.HorizontalAlignment = HorizontalAlignmentStyle.Right; ws.Cells[row, 4].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin; ws.Cells[row, 4].Value = string.Format("{0} USD", totalAmountSum.ToString("0.00")); } public static void AutoFitReport(ExcelFile excelFile) { foreach (var sheet in excelFile.Worksheets) { var columnCount = sheet.CalculateMaxUsedColumns(); for (int i = 0; i < columnCount; i++) { sheet.Columns[i].AutoFit(1, sheet.Rows[0], sheet.Rows[sheet.Rows.Count - 1]); } } } } }