4 Commits 4190ba370c ... dd7cede41c

Author SHA1 Message Date
  Piotr Czajkowski dd7cede41c Added ReadAll 2 months ago
  Piotr Czajkowski 0276fbffb8 Able to get worksheet by position 2 months ago
  Piotr Czajkowski d23b3ea5cd This should work better 2 months ago
  Piotr Czajkowski 2ec47d386d Able to get type 2 months ago

+ 34 - 0
ExcelORM/ExcelORM/ExcelDynamicReader.cs

@@ -26,6 +26,8 @@ public class ExcelDynamicReader
                 var cell = row.Cell(item.Position);
                 if (cell == null || cell.Value.IsBlank) continue;
 
+                if (item.Type == null) item.Type = cell.Value.ValueType();
+
                 var cellItem = item with
                 {
                     Value = cell.Value.ToObject()
@@ -43,6 +45,38 @@ public class ExcelDynamicReader
         var worksheet = xlWorkbook.Worksheets.FirstOrDefault(x => x.Name.Equals(worksheetName, StringComparison.InvariantCultureIgnoreCase));
         if (worksheet == null) yield break;
 
+        foreach (var value in Read(worksheet, startFrom, skip))
+            yield return value;
+    }
+
+    public IEnumerable<List<DynamicCell>> Read(int worksheetIndex = 1, uint startFrom = 1, uint skip = 0)
+    {
+        if (worksheetIndex > xlWorkbook.Worksheets.Count) yield break;
+
+        var worksheet = xlWorkbook.Worksheets.FirstOrDefault(x => x.Position == worksheetIndex);
+        if (worksheet == null) yield break;
+
+        foreach (var value in Read(worksheet, startFrom, skip))
+            yield return value;
+    }
+
+    public IEnumerable<DynamicWorksheet> ReadAll(uint startFrom = 1, uint skip = 0)
+    {
+        foreach (var worksheet in xlWorkbook.Worksheets)
+        {
+            yield return new DynamicWorksheet
+            {
+                Name = worksheet.Name,
+                Position = worksheet.Position,
+                Cells = Read(worksheet, startFrom, skip)
+            };
+        }
+    }
+
+    private IEnumerable<List<DynamicCell>> Read(IXLWorksheet? worksheet, uint startFrom = 1, uint skip = 0)
+    {
+        if (worksheet == null) yield break;
+
         var firstRow = worksheet.Row((int)startFrom);
         if (firstRow.IsEmpty())
             firstRow = worksheet.RowsUsed().First(x => x.RowNumber() > startFrom && !x.IsEmpty());

+ 9 - 0
ExcelORM/ExcelORM/Models/DynamicWorksheet.cs

@@ -0,0 +1,9 @@
+namespace ExcelORM.Models
+{
+    public record DynamicWorksheet
+    {
+        public string? Name { get; set; }
+        public int Position { get; set; }
+        public IEnumerable<List<DynamicCell>>? Cells { get; set; }
+    }
+}

+ 26 - 1
ExcelORM/ExcelORMTests/DynamicReaderTests.cs

@@ -5,7 +5,9 @@ namespace ExcelORMTests;
 public class DynamicReaderTests
 {
     private const string RegularFile = "testFiles/first.xlsx";
-    
+    private const string DifferentTypesFile = "testFiles/differentTypes.xlsx";
+    private const string MultipleSheetsFile = "testFiles/multipleSheets.xlsx";
+
     [Fact]
     public void Read()
     {
@@ -13,4 +15,27 @@ public class DynamicReaderTests
         var results = reader.Read("Sheet 1").ToArray();
         Assert.NotEmpty(results);
     }
+
+    [Fact]
+    public void ReadDifferentTypes()
+    {
+        var reader = new ExcelDynamicReader(DifferentTypesFile);
+        var results = reader.Read().ToArray();
+        Assert.NotEmpty(results);
+
+        var first = results.First();
+        Assert.Equal(typeof(string), first[0].Type);
+        Assert.Equal(typeof(DateTime?), first[1].Type);
+        Assert.Equal(typeof(TimeSpan?), first[2].Type);
+        Assert.Equal(typeof(double?), first[3].Type);
+        Assert.Equal(typeof(double?), first[4].Type);
+    }
+
+    [Fact]
+    public void ReadAll()
+    {
+        var reader = new ExcelDynamicReader(MultipleSheetsFile);
+        var results = reader.ReadAll().ToArray();
+        Assert.NotEmpty(results);
+    }
 }