65 lines
2.5 KiB
C#
65 lines
2.5 KiB
C#
using ClosedXML.Excel;
|
|
using System.Data;
|
|
using System.Globalization;
|
|
|
|
namespace Contime.data {
|
|
public class ExcelExporter {
|
|
private readonly DataAccess _dataAccess;
|
|
|
|
public ExcelExporter(DataAccess dataAccess) {
|
|
_dataAccess = dataAccess;
|
|
}
|
|
|
|
public void Export(string filePath) {
|
|
var allTimeEntries = _dataAccess.GetAllTimeEntriesForExport();
|
|
if (!allTimeEntries.Any()) {
|
|
// Handle case with no data
|
|
return;
|
|
}
|
|
|
|
using (var workbook = new XLWorkbook()) {
|
|
var groupedByWeek = allTimeEntries
|
|
.GroupBy(entry => GetIso8601WeekOfYear(entry.Date))
|
|
.OrderBy(g => g.Key);
|
|
|
|
foreach (var weekGroup in groupedByWeek) {
|
|
var weekNumber = weekGroup.Key;
|
|
var worksheet = workbook.Worksheets.Add($"KW {weekNumber}");
|
|
|
|
// --- Header ---
|
|
worksheet.Cell("A1").Value = "Date";
|
|
worksheet.Cell("B1").Value = "Task Description";
|
|
worksheet.Cell("C1").Value = "Duration (hh:mm:ss)";
|
|
var headerRange = worksheet.Range("A1:C1");
|
|
headerRange.Style.Font.Bold = true;
|
|
headerRange.Style.Fill.BackgroundColor = XLColor.LightGray;
|
|
|
|
int currentRow = 2;
|
|
var groupedByDay = weekGroup.GroupBy(entry => entry.Date.Date).OrderBy(g => g.Key);
|
|
|
|
foreach (var dayGroup in groupedByDay) {
|
|
foreach (var entry in dayGroup) {
|
|
worksheet.Cell(currentRow, 1).Value = entry.Date.ToString("yyyy-MM-dd");
|
|
worksheet.Cell(currentRow, 2).Value = entry.TaskName;
|
|
worksheet.Cell(currentRow, 3).Value = entry.Duration.ToString(@"hh\:mm\:ss");
|
|
currentRow++;
|
|
}
|
|
}
|
|
|
|
worksheet.Columns().AdjustToContents();
|
|
}
|
|
|
|
workbook.SaveAs(filePath);
|
|
}
|
|
}
|
|
|
|
private static int GetIso8601WeekOfYear(DateTime time) {
|
|
DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time);
|
|
if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday) {
|
|
time = time.AddDays(3);
|
|
}
|
|
return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
|
|
}
|
|
}
|
|
}
|