Black Rock Reporting Azure Function
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

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. }