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属性没有变小。 为什么这实际上不是从工作表中删除最后一行?
有没有更好的方法来完成这个?
RemoveRow方法似乎工作不正常。 看到这里提出的错误。
您预计该行将被删除,下面的其余行将“向上移动”。 其实这是MS Excel为你做的。 至于处理数据结构,NPOI并没有向上移动剩余的行,它只是删除该行中的所有单元格,即使被删除的行本身在“删除”后也不为空,它只是不包含单元格。
尝试这个:
while (rowIndex <= sheet.LastRowNum) { var row = sheet.GetRow(rowIndex); if (row != null) sheet.RemoveRow(row); rowIndex++; }
您可以使用ISheet
ShiftRows()
方法。 如果你把所有的行都从删除行之后的下一行开始,那么它将会起作用。 你也可以在这里看到讨论: https : //npoi.codeplex.com/workitem/8411
var row = sheet.GetRow(indexToBeDeleted); if (row != null) { sheet.RemoveRow(row); sheet.ShiftRows(indexToBeDeleted + 1, sheet.LastRowNum, -1); }