2015-06-24 116 views
1

我正在研究一個應用程序,該應用程序應該從文件末尾讀取一行,對其執行某些操作,然後刪除該行並更新該文件。C#NPOI Excel工具不會刪除該行嗎?

我正在使用NPOI庫,但它不起作用。 爲了從進來避免不良數據(空細胞),我運行下面的檢查:

IWorkbook WB; 
ISheet WS; 
ICell cell; 
using (FileStream FS = new FileStream(p, FileMode.Open, FileAccess.Read)) { 
    if (Path.GetExtension(p).ToLower().Equals("xls")) 
     WB = new HSSFWorkbook(FS); 
    else 
     WB = new XSSFWorkbook(FS); 
} 
WS = WB.GetSheetAt(0); 
cell = WS.GetRow(WS.LastRowNum).GetCell(0); 
if (cell == null) { 
    IRow row = WS.GetRow(WS.LastRowNum); 
    WS.RemoveRow(row); 
     using (FileStream FS = new FileStream(p, FileMode.Create, FileAccess.Write)) 
    WB.Write(FS); 
    DoFunc(args); 
} 

然而,這會陷入無限循環。我檢查了代碼,並且LastRowNum屬性沒有變小。爲什麼這實際上並沒有從工作表中刪除最後一行?

有沒有更好的方法來實現這個目標?

回答

1

RemoveRow方法似乎工作不正常。查看提交的錯誤here

您預計該行被刪除,其餘的行將會「向上移動」。其實這是MS Excel爲你做的。 至於處理數據結構,NPOI不會將其餘行向上移動,它只是刪除該行中的所有單元格,即使刪除的行本身在「刪除」後也不爲空,它只包含沒有單元格。

試試這個:

while (rowIndex <= sheet.LastRowNum) 
    { 
     var row = sheet.GetRow(rowIndex); 
     if (row != null) sheet.RemoveRow(row); 
     rowIndex++; 
    } 
+0

固定在NPOI 2.2.1 – DonnyTian

+0

的錯誤我仍然有同樣的問題,雖然我使用NPOI 2.2.1 – kevin

2

您可以使用ShiftRows()方法從ISheet。如果你從上一行刪除行後面的所有行向上移動,它就會起作用。您還可以看到這裏的討論: https://npoi.codeplex.com/workitem/8411

var row = sheet.GetRow(indexToBeDeleted); 
if (row != null) 
{ 
    sheet.RemoveRow(row); 
    sheet.ShiftRows(indexToBeDeleted + 1, sheet.LastRowNum, -1); 
}