|  | @@ -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));
 |  |          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));
 |  |          var worksheet = xlWorkbook.Worksheets.FirstOrDefault(x => x.Name.Equals(worksheetName, StringComparison.InvariantCultureIgnoreCase));
 | 
											
												
													
														|  |          if (worksheet == null) yield break;
 |  |          if (worksheet == null) yield break;
 | 
											
										
											
												
													
														|  | @@ -55,18 +55,23 @@ public class ExcelReader
 | 
											
												
													
														|  |      {
 |  |      {
 | 
											
												
													
														|  |          if (worksheet == null) yield break;
 |  |          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;
 |  |          if (mapping == null) yield break;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |          var rowsToProcess = (ObeyFilter && worksheet.AutoFilter.IsEnabled) switch
 |  |          var rowsToProcess = (ObeyFilter && worksheet.AutoFilter.IsEnabled) switch
 | 
											
												
													
														|  |          {
 |  |          {
 | 
											
												
													
														|  |              true => worksheet.AutoFilter.VisibleRows
 |  |              true => worksheet.AutoFilter.VisibleRows
 | 
											
												
													
														|  | 
 |  | +                .Where(x => x.RowNumber() > firstRow.RowNumber())
 | 
											
												
													
														|  |                  .Select(x => x.WorksheetRow()),
 |  |                  .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);
 |  |              .Skip((int)skip);
 | 
											
												
													
														|  |          
 |  |          
 | 
											
												
													
														|  |          foreach (var item in ProcessRows<T>(rowsToProcess, mapping))
 |  |          foreach (var item in ProcessRows<T>(rowsToProcess, mapping))
 |