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);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |