|  | @@ -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))
 |