|
@@ -0,0 +1,62 @@
|
|
|
+using ClosedXML.Excel;
|
|
|
+using ExcelORM.Models;
|
|
|
+
|
|
|
+namespace ExcelORM;
|
|
|
+
|
|
|
+public class ExcelDynamicWriter
|
|
|
+{
|
|
|
+ private readonly IXLWorkbook xlWorkbook;
|
|
|
+ public ExcelDynamicWriter(string? path = null)
|
|
|
+ {
|
|
|
+ xlWorkbook = File.Exists(path) ? new XLWorkbook(path) : new XLWorkbook();
|
|
|
+ }
|
|
|
+
|
|
|
+ private static int GenerateHeader(IXLWorksheet worksheet, IEnumerable<DynamicCell> firstRow)
|
|
|
+ {
|
|
|
+ var rowIndex = 1;
|
|
|
+ foreach (var item in firstRow)
|
|
|
+ worksheet.Cell(rowIndex, item.Position).Value = item.Header;
|
|
|
+
|
|
|
+ return ++rowIndex;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void Write(IEnumerable<List<DynamicCell>>? values, string? worksheetName = null, bool append = false)
|
|
|
+ {
|
|
|
+ if (values == null) return;
|
|
|
+
|
|
|
+ var xlWorksheet = xlWorkbook.Worksheets.FirstOrDefault(x => x.Name.Equals(worksheetName, StringComparison.InvariantCultureIgnoreCase));
|
|
|
+
|
|
|
+ xlWorksheet ??= !string.IsNullOrWhiteSpace(worksheetName) ?
|
|
|
+ xlWorkbook.AddWorksheet(worksheetName)
|
|
|
+ : xlWorkbook.Worksheets.Count == 0 ? xlWorkbook.AddWorksheet() : xlWorkbook.Worksheets.First();
|
|
|
+
|
|
|
+ Write(values, xlWorksheet, append);
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void Write(IEnumerable<List<DynamicCell>> values, IXLWorksheet worksheet, bool append)
|
|
|
+ {
|
|
|
+ var rowIndex = append switch
|
|
|
+ {
|
|
|
+ true => worksheet.LastRowUsed().RowNumber() + 1,
|
|
|
+ false => GenerateHeader(worksheet, values.First()),
|
|
|
+ };
|
|
|
+
|
|
|
+ foreach (var row in values)
|
|
|
+ {
|
|
|
+ foreach (var cell in row)
|
|
|
+ {
|
|
|
+ if (cell.Value == null) continue;
|
|
|
+
|
|
|
+ worksheet.Cell(rowIndex, cell.Position).Value = XLCellValue.FromObject(cell.Value);
|
|
|
+ }
|
|
|
+
|
|
|
+ rowIndex++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void SaveAs(string path, IExcelConverter? converter = null)
|
|
|
+ {
|
|
|
+ xlWorkbook.SaveAs(path);
|
|
|
+ converter?.MakeCompatible(path);
|
|
|
+ }
|
|
|
+}
|