Black Rock Reporting Azure Function
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

ReportGenerator.cs 7.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. using GemBox.Spreadsheet;
  2. using BlackRockReportFunction.Models;
  3. namespace BlackRockReportFunction.Bussines
  4. {
  5. internal class ReportGenerator
  6. {
  7. public const string DefaultFontName = "DejaVu Sans";
  8. public const int DefaultFontSize = 20;
  9. public static ExcelFile GenerateReportContent(Root reportObject)
  10. {
  11. string licenseKey = Environment.GetEnvironmentVariable("GemBoxLicenseKey");
  12. SpreadsheetInfo.SetLicense(licenseKey);
  13. var excelFile = new ExcelFile();
  14. var ws = excelFile.Worksheets.Add("Content");
  15. var sectionStyle = new CellStyle
  16. {
  17. Font =
  18. {
  19. Name = DefaultFontName,
  20. Weight = ExcelFont.BoldWeight,
  21. Size = DefaultFontSize * 12,
  22. },
  23. VerticalAlignment = VerticalAlignmentStyle.Center,
  24. HorizontalAlignment = HorizontalAlignmentStyle.Left,
  25. };
  26. var mainDetailsStyle = new CellStyle
  27. {
  28. Font =
  29. {
  30. Name = DefaultFontName,
  31. Weight = ExcelFont.BoldWeight,
  32. Size = DefaultFontSize * 11,
  33. },
  34. VerticalAlignment = VerticalAlignmentStyle.Center,
  35. };
  36. var normalDetailsStyle = new CellStyle
  37. {
  38. Font =
  39. {
  40. Name = DefaultFontName,
  41. Weight = ExcelFont.NormalWeight,
  42. Size = DefaultFontSize * 11,
  43. },
  44. VerticalAlignment = VerticalAlignmentStyle.Center,
  45. };
  46. AddReportItems(reportObject, ws, sectionStyle, mainDetailsStyle, normalDetailsStyle);
  47. // Autofit
  48. AutoFitReport(excelFile);
  49. return excelFile;
  50. }
  51. public static void AddReportItems(Root reportObject, ExcelWorksheet ws, CellStyle sectionStyle, CellStyle mainDetailsStyle, CellStyle normalDetailsStyle)
  52. {
  53. TimeSpan t, time,time1;
  54. int row = 0;
  55. string[] sectionNames = { "User ", "Description ", "Time (h) ", "Time (decimal) "};
  56. decimal totalAmountSum = 0;
  57. List<string> usersDecimalHours = new List<string>();
  58. for (int i = 0; i < sectionNames.Length; i++)
  59. {
  60. ws.Cells[row, i].Style = sectionStyle;
  61. ws.Cells[row, i].Value = sectionNames[i];
  62. ws.Cells[row, i].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin;
  63. ws.Cells[row, i].Style.Borders[IndividualBorder.Bottom].LineStyle = LineStyle.Thick;
  64. ws.Cells[row, i].Style.Borders[IndividualBorder.Bottom].LineColor = System.Drawing.Color.LightGray;
  65. }
  66. row++;
  67. foreach (var reportPerson in reportObject.groupOne)
  68. {
  69. ws.Cells[row, 0].Style = mainDetailsStyle;
  70. ws.Cells[row, 0].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin;
  71. ws.Cells[row, 0].Value = reportPerson.name;
  72. ws.Cells[row, 1].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin;
  73. time = TimeSpan.FromSeconds(reportPerson.duration);
  74. var sumOfRecordHours = string.Format("{0:00}:{1:D2}:{2:D2}", Math.Floor(time.TotalHours), time.Minutes, time.Seconds);
  75. ws.Cells[row, 2].Style = mainDetailsStyle;
  76. ws.Cells[row, 2].Style.HorizontalAlignment = HorizontalAlignmentStyle.Right;
  77. ws.Cells[row, 2].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin;
  78. ws.Cells[row, 2].Value = sumOfRecordHours;
  79. ws.Cells[row, 3].Style = mainDetailsStyle;
  80. ws.Cells[row, 3].Style.HorizontalAlignment = HorizontalAlignmentStyle.Right;
  81. ws.Cells[row, 3].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin;
  82. var userDecimalHours = Convert.ToDecimal(TimeSpan.FromSeconds(reportPerson.duration).TotalHours).ToString("0.00"); ;
  83. ws.Cells[row, 3].Value = userDecimalHours;
  84. usersDecimalHours.Add(userDecimalHours);
  85. row++;
  86. foreach (var personRecord in reportPerson.children)
  87. {
  88. ws.Cells[row, 0].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin;
  89. ws.Cells[row, 1].Style = normalDetailsStyle;
  90. ws.Cells[row, 1].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin;
  91. ws.Cells[row, 1].Value = personRecord.name;
  92. ws.Cells[row, 2].Style = normalDetailsStyle;
  93. ws.Cells[row, 2].Style.HorizontalAlignment = HorizontalAlignmentStyle.Right;
  94. ws.Cells[row, 2].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin;
  95. t = TimeSpan.FromSeconds(personRecord.duration);
  96. ws.Cells[row, 2].Value = string.Format("{0:00}:{1:D2}:{2:D2}", Math.Floor(t.TotalHours), t.Minutes,t.Seconds) ;
  97. ws.Cells[row, 3].Style = normalDetailsStyle;
  98. ws.Cells[row, 3].Style.HorizontalAlignment = HorizontalAlignmentStyle.Right;
  99. ws.Cells[row, 3].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin;
  100. ws.Cells[row, 3].Value = Convert.ToDecimal(TimeSpan.FromSeconds(personRecord.duration).TotalHours).ToString("0.00");
  101. row++;
  102. }
  103. }
  104. var totalSum = reportObject.totals.Select(total => total.totalTime).FirstOrDefault();
  105. ws.Cells[row, 0].Style = mainDetailsStyle;
  106. ws.Cells[row, 0].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin;
  107. ws.Cells[row, 0].Value = "Total";
  108. ws.Cells[row, 2].Style = mainDetailsStyle;
  109. ws.Cells[row, 2].Style.HorizontalAlignment = HorizontalAlignmentStyle.Right;
  110. ws.Cells[row, 2].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin;
  111. time1= t = TimeSpan.FromSeconds(totalSum);
  112. ws.Cells[row, 2].Value = string.Format("{0:00}:{1:D2}:{2:D2}", Math.Floor(time1.TotalHours), time1.Minutes, time1.Seconds);
  113. ws.Cells[row, 3].Style = mainDetailsStyle;
  114. ws.Cells[row, 3].Style.HorizontalAlignment = HorizontalAlignmentStyle.Right;
  115. ws.Cells[row, 3].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin;
  116. ws.Cells[row, 3].Value = Convert.ToDecimal(TimeSpan.FromSeconds(totalSum).TotalHours).ToString("0.00"); ;
  117. }
  118. public static void AutoFitReport(ExcelFile excelFile)
  119. {
  120. foreach (var sheet in excelFile.Worksheets)
  121. {
  122. var columnCount = sheet.CalculateMaxUsedColumns();
  123. for (int i = 0; i < columnCount; i++)
  124. {
  125. sheet.Columns[i].AutoFit(1, sheet.Rows[0], sheet.Rows[sheet.Rows.Count - 1]);
  126. }
  127. }
  128. }
  129. }
  130. }