Black Rock Reporting Azure Function
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

ReportGenerator.cs 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. using GemBox.Spreadsheet;
  2. using BlackRockReportFunction.Models;
  3. using BlackRockReportFunction.Helpers;
  4. namespace BlackRockReportFunction.Bussines
  5. {
  6. internal class ReportGenerator
  7. {
  8. public const string DefaultFontName = "Calibri";
  9. public const int DefaultFontSize = 20;
  10. public static ExcelFile GenerateReportContent()
  11. {
  12. string licenseKey = Environment.GetEnvironmentVariable("GemBoxLicenseKey");
  13. SpreadsheetInfo.SetLicense(licenseKey);
  14. var testObject = new ClockifyReport
  15. {
  16. reportName = "BlackRockReport_20220615",
  17. reportDescription = "Total (13/06/2022 - 15/06/2022)",
  18. reportPeople = new List<Person>
  19. {
  20. new Person
  21. {
  22. fullName = "Nikola Jovanovic",
  23. records = new List<ClockifyRecord>
  24. {
  25. new ClockifyRecord
  26. {
  27. recordDescription = "massa placerat duis ultricies lacus sed turpis tincidunt id aliquet risus feugiat in ante metus dictum at tempor commodo ullamcorper",
  28. recordTime = new TimeOnly(3,15,44),
  29. amount = 200
  30. },
  31. new ClockifyRecord
  32. {
  33. recordDescription = "et tortor at risus viverra adipiscing at in tellus integer feugiat scelerisque varius morbi enim nunc faucibus a pellentesque sit",
  34. recordTime = new TimeOnly(3,15,44),
  35. amount = 150
  36. }
  37. }
  38. },
  39. new Person
  40. {
  41. fullName = "Boris Stevanovic",
  42. records = new List<ClockifyRecord>
  43. {
  44. new ClockifyRecord
  45. {
  46. recordDescription = "iaculis urna id volutpat lacus laoreet non curabitur gravida arcu ac tortor dignissim convallis aenean et tortor at risus viverra",
  47. recordTime = new TimeOnly(3,15,44),
  48. amount = 300
  49. },
  50. new ClockifyRecord
  51. {
  52. recordDescription = "gravida arcu ac tortor dignissim convallis aenean et tortor at risus viverra adipiscing at in tellus integer feugiat scelerisque varius",
  53. recordTime = new TimeOnly(3,15,44),
  54. amount = 100
  55. },
  56. new ClockifyRecord
  57. {
  58. recordDescription = "sit amet massa vitae tortor condimentum lacinia quis vel eros donec ac odio tempor orci dapibus ultrices in iaculis nunc",
  59. recordTime = new TimeOnly(3,15,44),
  60. amount = 120
  61. }
  62. }
  63. },
  64. new Person
  65. {
  66. fullName = "Dunja Stevanovic",
  67. records = new List<ClockifyRecord>
  68. {
  69. new ClockifyRecord
  70. {
  71. recordDescription = "vulputate mi sit amet mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada proin libero nunc",
  72. recordTime = new TimeOnly(3,15,44),
  73. amount = 50
  74. },
  75. new ClockifyRecord
  76. {
  77. recordDescription = "senectus et netus et malesuada fames ac turpis egestas maecenas pharetra convallis posuere morbi leo urna molestie at elementum eu",
  78. recordTime = new TimeOnly(3,15,44),
  79. amount = 500
  80. }
  81. }
  82. }
  83. }
  84. };
  85. var excelFile = new ExcelFile();
  86. var ws = excelFile.Worksheets.Add("Content");
  87. var sectionStyle = new CellStyle
  88. {
  89. Font =
  90. {
  91. Name = DefaultFontName,
  92. Weight = ExcelFont.BoldWeight,
  93. Size = DefaultFontSize * 12,
  94. },
  95. VerticalAlignment = VerticalAlignmentStyle.Center,
  96. HorizontalAlignment = HorizontalAlignmentStyle.Left,
  97. };
  98. var mainDetailsStyle = new CellStyle
  99. {
  100. Font =
  101. {
  102. Name = DefaultFontName,
  103. Weight = ExcelFont.BoldWeight,
  104. Size = DefaultFontSize * 11,
  105. },
  106. VerticalAlignment = VerticalAlignmentStyle.Center,
  107. };
  108. var normalDetailsStyle = new CellStyle
  109. {
  110. Font =
  111. {
  112. Name = DefaultFontName,
  113. Weight = ExcelFont.NormalWeight,
  114. Size = DefaultFontSize * 10,
  115. },
  116. VerticalAlignment = VerticalAlignmentStyle.Center,
  117. };
  118. AddReportItems(testObject, ws, sectionStyle, mainDetailsStyle, normalDetailsStyle);
  119. // Autofit
  120. AutoFitReport(excelFile);
  121. return excelFile;
  122. }
  123. public static void AddReportItems(ClockifyReport reportObject, ExcelWorksheet ws, CellStyle sectionStyle, CellStyle mainDetailsStyle, CellStyle normalDetailsStyle)
  124. {
  125. int row = 0;
  126. string[] sectionNames = { "User ", "Description ", "Time (h) ", "Time (decimal) ", "Amount (USD) " };
  127. decimal totalAmountSum = 0;
  128. List<string> usersDecimalHours = new List<string>();
  129. for (int i = 0; i < sectionNames.Length; i++)
  130. {
  131. ws.Cells[row, i].Style = sectionStyle;
  132. ws.Cells[row, i].Value = sectionNames[i];
  133. ws.Cells[row, i].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin;
  134. ws.Cells[row, i].Style.Borders[IndividualBorder.Bottom].LineStyle = LineStyle.Thick;
  135. ws.Cells[row, i].Style.Borders[IndividualBorder.Bottom].LineColor = System.Drawing.Color.LightGray;
  136. }
  137. row++;
  138. foreach (var reportPerson in reportObject.reportPeople)
  139. {
  140. ws.Cells[row, 0].Style = mainDetailsStyle;
  141. ws.Cells[row, 0].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin;
  142. ws.Cells[row, 0].Value = reportPerson.fullName;
  143. ws.Cells[row, 1].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin;
  144. var sumOfRecordHours = Formaters.getSumOfRecordTimes(reportPerson.records.Select(record => record.recordTime).ToList());
  145. ws.Cells[row, 2].Style = mainDetailsStyle;
  146. ws.Cells[row, 2].Style.HorizontalAlignment = HorizontalAlignmentStyle.Right;
  147. ws.Cells[row, 2].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin;
  148. ws.Cells[row, 2].Value = sumOfRecordHours;
  149. ws.Cells[row, 3].Style = mainDetailsStyle;
  150. ws.Cells[row, 3].Style.HorizontalAlignment = HorizontalAlignmentStyle.Right;
  151. ws.Cells[row, 3].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin;
  152. var userDecimalHours = Formaters.getDecimalHours(sumOfRecordHours);
  153. ws.Cells[row, 3].Value = userDecimalHours;
  154. usersDecimalHours.Add(userDecimalHours);
  155. ws.Cells[row, 4].Style = mainDetailsStyle;
  156. ws.Cells[row, 4].Style.HorizontalAlignment = HorizontalAlignmentStyle.Right;
  157. ws.Cells[row, 4].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin;
  158. ws.Cells[row, 4].Value = string.Format("{0} USD", reportPerson.records.Sum(record => record.amount).ToString("0.00"));
  159. totalAmountSum += reportPerson.records.Sum(record => record.amount);
  160. row++;
  161. foreach (var personRecord in reportPerson.records)
  162. {
  163. ws.Cells[row, 0].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin;
  164. ws.Cells[row, 1].Style = normalDetailsStyle;
  165. ws.Cells[row, 1].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin;
  166. ws.Cells[row, 1].Value = personRecord.recordDescription;
  167. ws.Cells[row, 2].Style = normalDetailsStyle;
  168. ws.Cells[row, 2].Style.HorizontalAlignment = HorizontalAlignmentStyle.Right;
  169. ws.Cells[row, 2].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin;
  170. ws.Cells[row, 2].Value = Formaters.getRecordTime(personRecord.recordTime);
  171. ws.Cells[row, 3].Style = normalDetailsStyle;
  172. ws.Cells[row, 3].Style.HorizontalAlignment = HorizontalAlignmentStyle.Right;
  173. ws.Cells[row, 3].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin;
  174. ws.Cells[row, 3].Value = Formaters.getDecimalHours(personRecord.recordTime);
  175. ws.Cells[row, 4].Style = normalDetailsStyle;
  176. ws.Cells[row, 4].Style.HorizontalAlignment = HorizontalAlignmentStyle.Right;
  177. ws.Cells[row, 4].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin;
  178. ws.Cells[row, 4].Value = string.Format("{0} USD", personRecord.amount.ToString("0.00"));
  179. row++;
  180. }
  181. }
  182. ws.Cells.GetSubrangeAbsolute(row, 0, row, 1).Merged = true;
  183. ws.Cells.GetSubrangeAbsolute(row, 0, row, 1).Style = mainDetailsStyle;
  184. ws.Cells.GetSubrangeAbsolute(row, 0, row, 1).Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin;
  185. ws.Cells.GetSubrangeAbsolute(row, 0, row, 1).Value = reportObject.reportDescription;
  186. var totalSum = Formaters.getTotalSum(
  187. reportObject.reportPeople.Select(
  188. person => Formaters.getSumOfRecordTimes(
  189. person.records.Select(record => record.recordTime).ToList()
  190. )
  191. ).ToList()
  192. );
  193. ws.Cells[row, 2].Style = mainDetailsStyle;
  194. ws.Cells[row, 2].Style.HorizontalAlignment = HorizontalAlignmentStyle.Right;
  195. ws.Cells[row, 2].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin;
  196. ws.Cells[row, 2].Value = totalSum;
  197. ws.Cells[row, 3].Style = mainDetailsStyle;
  198. ws.Cells[row, 3].Style.HorizontalAlignment = HorizontalAlignmentStyle.Right;
  199. ws.Cells[row, 3].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin;
  200. ws.Cells[row, 3].Value = Formaters.getTotalDecimalHours(usersDecimalHours);
  201. ws.Cells[row, 4].Style = mainDetailsStyle;
  202. ws.Cells[row, 4].Style.HorizontalAlignment = HorizontalAlignmentStyle.Right;
  203. ws.Cells[row, 4].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin;
  204. ws.Cells[row, 4].Value = string.Format("{0} USD", totalAmountSum.ToString("0.00"));
  205. }
  206. public static void AutoFitReport(ExcelFile excelFile)
  207. {
  208. foreach (var sheet in excelFile.Worksheets)
  209. {
  210. var columnCount = sheet.CalculateMaxUsedColumns();
  211. for (int i = 0; i < columnCount; i++)
  212. {
  213. sheet.Columns[i].AutoFit(1, sheet.Rows[0], sheet.Rows[sheet.Rows.Count - 1]);
  214. }
  215. }
  216. }
  217. }
  218. }