2017-02-14 6 views
0

Мне нужно удалить пустые ячейки из таблиц Excel. Мы используем для создания и редактирования файлов ClosedXML.Удалить несколько ячеек с закрытымXML

Пример Excel-До:

XX XX     XX    XX XX 
    XX XX     XX    XX XX 
XX XX XX     XX    XX XX 
XX XX XX     XX    XX XX 

Пример Excel-After:

XX XX XX XX XX 
XX XX XX XX XX 
XX XX XX XX XX XX 
XX XX XX XX XX XX 

Мой первый тест был Еогеасп над всеми пустыми клетками. Но это не работает, потому что только первая ячейка в строке будет удалена.

private void DeleteCell() 
    { 
     List<IXLCell> AllEmptyCells = ws.Cells().Where(w => String.IsNullOrEmpty(w.Value.ToString())).ToList(); 

     foreach(IXLCell cell in AllEmptyCells) 
     { 
      cell.Delete(XLShiftDeletedCells.ShiftCellsLeft); 
     } 
    } 

Мой второй тест работает, но для его завершения требуется много времени. При каждом вызове список будет создан новым, пока список не будет пустым.

private void DeleteCell() 
    { 
     List<IXLCell> AllEmptyCells = ws.Cells().Where(w => String.IsNullOrEmpty(w.Value.ToString())).ToList(); 
     if(AllEmptyCells.Count > 0) 
     { 
      ws.Cell(AllEmptyCells.FirstOrDefault().Address).Delete(XLShiftDeletedCells.ShiftCellsLeft); 
      DeleteCell(); 
     } 

    } 

За 100 строк эта часть будет работать ~ 2 Мин. Кто-нибудь знает лучший способ?

ответ

0

Вместо того, чтобы перебирать все ячейки в ws.Cells(), вы можете посмотреть ws.RangeUsed().Cells(). Это будет игнорировать все ячейки после последней ячейки, которая фактически используется.

0
  1. Вы перечислите все ячейки на листе, а не только используемую область.
  2. Путем удаления ячеек вы перемещаете новые (пустые) ячейки в свой диапазон и перемещаете ячейки с содержимым в позиции пустых ячеек.

Быстрее и чище подход будет что-то вроде этого:

int maxColNo = sheet.LastColumnUsed().ColumnNumber(); 
foreach (var row in sheet.RowsUsed()) 
{ 
    for (int colNo = maxColNo; colNo > 0; colNo--) 
    { 
     if (row.Cell(colNo).IsEmpty()) 
     { 
      row.Cell(colNo).Delete(XLShiftDeletedCells.ShiftCellsLeft); 
     } 
    } 
} 
0

Im Теперь перечислим с Reverse<T> в моем списке. Im немного быстрее, чем раньше. Мне не нужно вызывать мой метод рекурсивным.

private void DeleteCell() 
    { 
     AllEmptyCells = ws.Cells().Where(w => String.IsNullOrEmpty(w.Value.ToString())).ToList(); 

     foreach(var item in AllEmptyCells.Reverse<IXLCell>()) 
     { 
      ws.Cell(item.Address.RowNumber, item.Address.ColumnNumber).Delete(XLShiftDeletedCells.ShiftCellsLeft); 
     } 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^