2017-02-14 134 views
0

我必須從Excel表格中刪除空單元格。我們用它來創建和編輯ClosedXML文件。使用ClosedXML刪除多個單元格

例的Excel之前:

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

例的Excel後:

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

我的第一次測試是在所有空單元格一個foreach。但是這不起作用,因爲只有行中的第一個單元格將被刪除。

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

林現在Reverse<T>我的列表中列舉。我比之前快了一點。我不需要調用我的方法遞歸。

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