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