Selaa lähdekoodia

Should be more flexible

Piotr Czajkowski 1 vuosi sitten
vanhempi
commit
4ad96777ab
1 muutettua tiedostoa jossa 10 lisäystä ja 9 poistoa
  1. 10 9
      ExcelORM/ExcelORM/ExcelReader.cs

+ 10 - 9
ExcelORM/ExcelORM/ExcelReader.cs

@@ -1,4 +1,3 @@
-using System.Reflection;
 using ClosedXML.Excel;
 
 namespace ExcelORM;
@@ -6,7 +5,6 @@ namespace ExcelORM;
 public class ExcelReader
 {
     private readonly IXLWorkbook xlWorkbook;
-    public uint SkipFirstNRows { get; set; } = 1;
     public bool SkipHidden { get; set; }
     public bool ObeyFilter { get; set; }
 
@@ -39,21 +37,21 @@ public class ExcelReader
         }
     }
 
-    public IEnumerable<T> Read<T>() where T : class, new()
+    public IEnumerable<T> Read<T>(uint startFrom = 1, uint skip = 1) where T : class, new()
     {
-        return xlWorkbook.Worksheets.SelectMany(Read<T>);
+        return xlWorkbook.Worksheets.SelectMany(worksheet => Read<T>(worksheet, startFrom, skip));
     }
 
-    public IEnumerable<T> Read<T>(string? worksheetName) where T : class, new()
+    public IEnumerable<T> Read<T>(string? worksheetName, uint startFrom = 1, uint skip = 1) where T : class, new()
     {
         var worksheet = xlWorkbook.Worksheets.FirstOrDefault(x => x.Name.Equals(worksheetName, StringComparison.InvariantCultureIgnoreCase));
         if (worksheet == null) yield break;
 
-        foreach (var value in Read<T>(worksheet))
+        foreach (var value in Read<T>(worksheet, startFrom, skip))
             yield return value;
     }
 
-    private IEnumerable<T> Read<T>(IXLWorksheet? worksheet) where T : class, new()
+    private IEnumerable<T> Read<T>(IXLWorksheet? worksheet, uint startFrom, uint skip) where T : class, new()
     {
         if (worksheet == null) yield break;
 
@@ -63,12 +61,15 @@ public class ExcelReader
         if (ObeyFilter && worksheet.AutoFilter.IsEnabled)
         {
             foreach (var item in ProcessRows<T>(worksheet.AutoFilter.VisibleRows
-                         .Select(x => x.WorksheetRow()).Skip((int)SkipFirstNRows), mapping))
+                         .Where(x => x.RowNumber() >= startFrom)
+                         .Select(x => x.WorksheetRow()).Skip((int)skip), mapping))
                 yield return item;
         }
         else
         {
-            foreach (var item in ProcessRows<T>(worksheet.RowsUsed().Skip((int)SkipFirstNRows), mapping))
+            foreach (var item in ProcessRows<T>(worksheet.RowsUsed()
+                         .Where(x => x.RowNumber() >= startFrom)
+                         .Skip((int)skip), mapping))
                 yield return item;
         }
     }