Browse Source

Added ExcelDynamicWriter

Piotr Czajkowski 2 months ago
parent
commit
3fa518940e

+ 62 - 0
ExcelORM/ExcelORM/ExcelDynamicWriter.cs

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

+ 31 - 0
ExcelORM/ExcelORMTests/DynamicWriterTests.cs

@@ -0,0 +1,31 @@
+using ExcelORM;
+
+namespace ExcelORMTests;
+
+public class DynamicWriterTests
+{
+    private const string DifficultFile = "testFiles/dynamicDifficult.xlsx";
+
+    [Fact]
+    public void Write()
+    {
+        var testFile = Path.GetRandomFileName();
+        testFile = Path.ChangeExtension(testFile, "xlsx");
+
+        var reader = new ExcelDynamicReader(DifficultFile);
+        var results = reader.Read().ToArray();
+        Assert.NotEmpty(results);
+
+        var writer = new ExcelDynamicWriter();
+        writer.Write(results);
+        writer.SaveAs(testFile);
+
+        var savedReader = new ExcelDynamicReader(testFile);
+        var savedResults = savedReader.Read().ToArray();
+        Assert.NotEmpty(savedResults);
+        Assert.True(results.First().SequenceEqual(savedResults.First()));
+        Assert.True(results.Last().SequenceEqual(savedResults.Last()));
+
+        File.Delete(testFile);
+    }
+}