Ver código fonte

Properly handling start from1

Piotr Czajkowski 7 meses atrás
pai
commit
71d05a9061

+ 10 - 5
ExcelORM/ExcelORM/ExcelReader.cs

@@ -37,12 +37,12 @@ public class ExcelReader
         }
     }
 
-    public IEnumerable<T> Read<T>(uint startFrom = 1, uint skip = 1) where T : class, new()
+    public IEnumerable<T> Read<T>(uint startFrom = 1, uint skip = 0) where T : class, new()
     {
         return xlWorkbook.Worksheets.SelectMany(worksheet => Read<T>(worksheet, startFrom, skip));
     }
 
-    public IEnumerable<T> Read<T>(string? worksheetName, uint startFrom = 1, uint skip = 1) where T : class, new()
+    public IEnumerable<T> Read<T>(string? worksheetName, uint startFrom = 1, uint skip = 0) where T : class, new()
     {
         var worksheet = xlWorkbook.Worksheets.FirstOrDefault(x => x.Name.Equals(worksheetName, StringComparison.InvariantCultureIgnoreCase));
         if (worksheet == null) yield break;
@@ -55,18 +55,23 @@ public class ExcelReader
     {
         if (worksheet == null) yield break;
 
-        var mapping = Mapping.MapProperties<T>(worksheet.FirstRowUsed().CellsUsed());
+        var firstRow = worksheet.Row((int)startFrom);
+        if (firstRow.IsEmpty())
+            firstRow = worksheet.RowsUsed().First(x => x.RowNumber() > startFrom && !x.IsEmpty());
+        
+        var mapping = Mapping.MapProperties<T>(firstRow.CellsUsed());
         if (mapping == null) yield break;
 
         var rowsToProcess = (ObeyFilter && worksheet.AutoFilter.IsEnabled) switch
         {
             true => worksheet.AutoFilter.VisibleRows
+                .Where(x => x.RowNumber() > firstRow.RowNumber())
                 .Select(x => x.WorksheetRow()),
-            false => worksheet.RowsUsed()
+            false => worksheet.RowsUsed().Where(x => x.RowNumber() > firstRow.RowNumber())
                 
         };
 
-        rowsToProcess = rowsToProcess.Where(x => x.RowNumber() >= startFrom)
+        rowsToProcess = rowsToProcess
             .Skip((int)skip);
         
         foreach (var item in ProcessRows<T>(rowsToProcess, mapping))

+ 4 - 1
ExcelORM/ExcelORMTests/ReaderTests.cs

@@ -49,8 +49,11 @@ public class ReaderTests
     public void ReadDifficult()
     {
         var reader = new ExcelReader(DifficultFile);
-        var results = reader.Read<Test>().ToArray();
+        var results = reader.Read<Test>("Tab").ToArray();
         Assert.NotEmpty(results);
+
+        var resultsWithTitle = reader.Read<Test>("WithTitle", startFrom: 2).ToArray();
+        Assert.Equal(results.Length, resultsWithTitle.Length);
     }
     
     [Fact]

BIN
ExcelORM/ExcelORMTests/testFiles/columnsOnTheLeftHeaderNotFirstRow.xlsx