using GemBox.Spreadsheet; using BlackRockReportFunction.Models; namespace BlackRockReportFunction.Bussines { internal class ReportGenerator { public const string DefaultFontName = "DejaVu Sans"; public const int DefaultFontSize = 20; public static ExcelFile GenerateReportContent(Root 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 * 11, }, VerticalAlignment = VerticalAlignmentStyle.Center, }; AddReportItems(reportObject, ws, sectionStyle, mainDetailsStyle, normalDetailsStyle); // Autofit AutoFitReport(excelFile); return excelFile; } public static void AddReportItems(Root reportObject, ExcelWorksheet ws, CellStyle sectionStyle, CellStyle mainDetailsStyle, CellStyle normalDetailsStyle) { TimeSpan t, time,time1; int row = 0; string[] sectionNames = { "User ", "Description ", "Time (h) ", "Time (decimal) "}; 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.groupOne) { ws.Cells[row, 0].Style = mainDetailsStyle; ws.Cells[row, 0].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin; ws.Cells[row, 0].Value = reportPerson.name; ws.Cells[row, 1].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin; time = TimeSpan.FromSeconds(reportPerson.duration); var sumOfRecordHours = string.Format("{0:00}:{1:D2}:{2:D2}", Math.Floor(time.TotalHours), time.Minutes, time.Seconds); 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 = Convert.ToDecimal(TimeSpan.FromSeconds(reportPerson.duration).TotalHours).ToString("0.00"); ; ws.Cells[row, 3].Value = userDecimalHours; usersDecimalHours.Add(userDecimalHours); row++; foreach (var personRecord in reportPerson.children) { 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.name; 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; t = TimeSpan.FromSeconds(personRecord.duration); ws.Cells[row, 2].Value = string.Format("{0:00}:{1:D2}:{2:D2}", Math.Floor(t.TotalHours), t.Minutes,t.Seconds) ; 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 = Convert.ToDecimal(TimeSpan.FromSeconds(personRecord.duration).TotalHours).ToString("0.00"); row++; } } var totalSum = reportObject.totals.Select(total => total.totalTime).FirstOrDefault(); ws.Cells[row, 0].Style = mainDetailsStyle; ws.Cells[row, 0].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin; ws.Cells[row, 0].Value = "Total"; 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; time1= t = TimeSpan.FromSeconds(totalSum); ws.Cells[row, 2].Value = string.Format("{0:00}:{1:D2}:{2:D2}", Math.Floor(time1.TotalHours), time1.Minutes, time1.Seconds); 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 = Convert.ToDecimal(TimeSpan.FromSeconds(totalSum).TotalHours).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]); } } } } }