|
|
|
@@ -1,8 +1,9 @@ |
|
|
|
using GemBox.Spreadsheet; |
|
|
|
using Spire.Xls; |
|
|
|
using System; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Linq; |
|
|
|
using ClockifyReport.Models; |
|
|
|
using System.Drawing; |
|
|
|
|
|
|
|
namespace BlackRockReportFunction.Bussines |
|
|
|
{ |
|
|
|
@@ -11,50 +12,12 @@ namespace BlackRockReportFunction.Bussines |
|
|
|
public const string DefaultFontName = "DejaVu Sans"; |
|
|
|
public const int DefaultFontSize = 20; |
|
|
|
|
|
|
|
public static ExcelFile GenerateReportContent(Root reportObject) |
|
|
|
public static Workbook GenerateReportContent(Root reportObject) |
|
|
|
{ |
|
|
|
string licenseKey = Environment.GetEnvironmentVariable("GemBoxLicenseKey"); |
|
|
|
SpreadsheetInfo.SetLicense(licenseKey); |
|
|
|
|
|
|
|
var excelFile = new ExcelFile(); |
|
|
|
|
|
|
|
var excelFile = new Workbook(); |
|
|
|
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 * 10, |
|
|
|
}, |
|
|
|
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); |
|
|
|
AddReportItems(reportObject, ws); |
|
|
|
|
|
|
|
// Autofit |
|
|
|
AutoFitReport(excelFile); |
|
|
|
@@ -62,107 +25,109 @@ namespace BlackRockReportFunction.Bussines |
|
|
|
return excelFile; |
|
|
|
} |
|
|
|
|
|
|
|
public static void AddReportItems(Root reportObject, ExcelWorksheet ws, CellStyle sectionStyle, CellStyle mainDetailsStyle, CellStyle normalDetailsStyle) |
|
|
|
public static void AddReportItems(Root reportObject, Worksheet ws) |
|
|
|
{ |
|
|
|
|
|
|
|
TimeSpan t, time, time1; |
|
|
|
int row = 0; |
|
|
|
int row = 1; |
|
|
|
string[] sectionNames = { "User ", "Description ", "Time (h) ", "Time (decimal) " }; |
|
|
|
decimal totalAmountSum = 0; |
|
|
|
List<string> usersDecimalHours = new List<string>(); |
|
|
|
|
|
|
|
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; |
|
|
|
ws.Range[row, i + 1].Style.Font.FontName = "DejaVu Sans"; |
|
|
|
ws.Range[row, i + 1].Style.Font.Size = 240; |
|
|
|
ws.Range[row, i + 1].Value = sectionNames[i]; |
|
|
|
ws.Range[row, i + 1].Style.Borders[BordersLineType.EdgeRight].LineStyle = LineStyleType.Thin; |
|
|
|
ws.Range[row, i + 1].Style.Borders[BordersLineType.EdgeBottom].LineStyle = LineStyleType.Thick; |
|
|
|
ws.Range[row, i + 1].Style.Borders[BordersLineType.EdgeBottom].Color = 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.Range[row, 1].Style.Font.FontName = "DejaVu Sans"; |
|
|
|
ws.Range[row, 1].Style.Font.Size = 200; |
|
|
|
ws.Range[row, 1].Style.Borders[BordersLineType.EdgeRight].LineStyle = LineStyleType.Thin; |
|
|
|
ws.Range[row, 1].Value = reportPerson.name; |
|
|
|
|
|
|
|
ws.Cells[row, 1].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin; |
|
|
|
ws.Range[row, 2].Style.Borders[BordersLineType.EdgeRight].LineStyle = LineStyleType.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; |
|
|
|
ws.Range[row, 3].Style.Font.FontName = "DejaVu Sans"; |
|
|
|
ws.Range[row, 3].Style.Font.Size = 200; |
|
|
|
ws.Range[row, 3].Style.HorizontalAlignment = HorizontalAlignType.Right; |
|
|
|
ws.Range[row, 3].Style.Borders[BordersLineType.EdgeRight].LineStyle = LineStyleType.Thin; |
|
|
|
ws.Range[row, 3].Value = sumOfRecordHours; |
|
|
|
|
|
|
|
ws.Range[row, 4].Style.Font.FontName = "DejaVu Sans"; |
|
|
|
ws.Range[row, 4].Style.Font.Size = 200; |
|
|
|
ws.Range[row, 4].Style.HorizontalAlignment = HorizontalAlignType.Right; |
|
|
|
ws.Range[row, 4].Style.Borders[BordersLineType.EdgeRight].LineStyle = LineStyleType.Thin; |
|
|
|
var userDecimalHours = Convert.ToDecimal(TimeSpan.FromSeconds(reportPerson.duration).TotalHours).ToString("0.00"); ; |
|
|
|
ws.Cells[row, 3].Value = userDecimalHours; |
|
|
|
ws.Range[row, 4].Value = userDecimalHours; |
|
|
|
usersDecimalHours.Add(userDecimalHours); |
|
|
|
|
|
|
|
|
|
|
|
row++; |
|
|
|
|
|
|
|
foreach (var personRecord in reportPerson.children) |
|
|
|
{ |
|
|
|
ws.Cells[row, 0].Style.Borders[IndividualBorder.Right].LineStyle = LineStyle.Thin; |
|
|
|
ws.Range[row, 1].Style.Borders[BordersLineType.EdgeRight].LineStyle = LineStyleType.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.Range[row, 2].Style.Font.FontName = "DejaVu Sans"; |
|
|
|
ws.Range[row, 2].Style.Font.Size = 200; |
|
|
|
ws.Range[row, 2].Style.Borders[BordersLineType.EdgeRight].LineStyle = LineStyleType.Thin; |
|
|
|
ws.Range[row, 2].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; |
|
|
|
ws.Range[row, 3].Style.Font.FontName = "DejaVu Sans"; |
|
|
|
ws.Range[row, 3].Style.Font.Size = 200; |
|
|
|
ws.Range[row, 3].Style.HorizontalAlignment = HorizontalAlignType.Right; |
|
|
|
ws.Range[row, 3].Style.Borders[BordersLineType.EdgeRight].LineStyle = LineStyleType.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"); |
|
|
|
|
|
|
|
ws[row, 3].Value = string.Format("{0:00}:{1:D2}:{2:D2}", Math.Floor(t.TotalHours), t.Minutes, t.Seconds); |
|
|
|
|
|
|
|
ws.Range[row, 4].Style.Font.FontName = "DejaVu Sans"; |
|
|
|
ws.Range[row, 4].Style.Font.Size = 200; |
|
|
|
ws.Range[row, 4].Style.HorizontalAlignment = HorizontalAlignType.Right; |
|
|
|
ws.Range[row, 4].Style.Borders[BordersLineType.EdgeRight].LineStyle = LineStyleType.Thin; |
|
|
|
ws.Range[row, 4].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.Range[row, 1].Style.Font.FontName = "DejaVu Sans"; |
|
|
|
ws.Range[row, 1].Style.Font.Size = 200; |
|
|
|
ws.Range[row, 1].Style.Borders[BordersLineType.EdgeRight].LineStyle = LineStyleType.Thin; |
|
|
|
ws.Range[row, 1].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; |
|
|
|
ws.Range[row, 3].Style.Font.FontName = "DejaVu Sans"; |
|
|
|
ws.Range[row, 3].Style.Font.Size = 200; |
|
|
|
ws.Range[row, 3].Style.HorizontalAlignment = HorizontalAlignType.Right; |
|
|
|
ws.Range[row, 3].Style.Borders[BordersLineType.EdgeRight].LineStyle = LineStyleType.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"); ; |
|
|
|
|
|
|
|
ws.Range[row, 3].Value = string.Format("{0:00}:{1:D2}:{2:D2}", Math.Floor(time1.TotalHours), time1.Minutes, time1.Seconds); |
|
|
|
|
|
|
|
ws.Range[row, 4].Style.Font.FontName = "DejaVu Sans"; |
|
|
|
ws.Range[row, 4].Style.Font.Size = 200; |
|
|
|
ws.Range[row, 4].Style.HorizontalAlignment = HorizontalAlignType.Right; |
|
|
|
ws.Range[row, 4].Style.Borders[BordersLineType.EdgeRight].LineStyle = LineStyleType.Thin; |
|
|
|
ws.Range[row, 4].Value = Convert.ToDecimal(TimeSpan.FromSeconds(totalSum).TotalHours).ToString("0.00"); |
|
|
|
} |
|
|
|
|
|
|
|
public static void AutoFitReport(ExcelFile excelFile) |
|
|
|
public static void AutoFitReport(Workbook excelFile) |
|
|
|
{ |
|
|
|
foreach (var sheet in excelFile.Worksheets) |
|
|
|
{ |
|
|
|
var columnCount = sheet.CalculateMaxUsedColumns(); |
|
|
|
var columnCount = sheet.Columns.Count(); |
|
|
|
|
|
|
|
for (int i = 0; i < columnCount; i++) |
|
|
|
for (int i = 1; i < columnCount; i++) |
|
|
|
{ |
|
|
|
sheet.Columns[i].AutoFit(1, sheet.Rows[0], sheet.Rows[sheet.Rows.Count - 1]); |
|
|
|
sheet.Columns[i].AutoFitRows(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |