C#NPOI Excel工具不会删除该行吗?

时间:2015-06-24 07:26:35

标签: c# excel npoi

我正在处理一个应该从文件末尾读取一行的应用程序,对它执行某些操作,然后删除该行并更新该文件。

我正在使用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属性没有变小。为什么这实际上没有从工作表中删除最后一行?

有没有更好的方法来实现这一目标?

3 个答案:

答案 0 :(得分:4)

您可以使用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);
}

答案 1 :(得分:1)

RemoveRow方法似乎效果不佳。请参阅提交的错误here

您希望删除该行,下面的其余行将会#34;向上移动"。实际上那就是MS Excel为你做的。 至于处理数据结构,NPOI不向上移动其余行,它只删除该行中的所有单元格,即使删除的行本身在" remove"之后也不为空,它只包含没有细胞。

试试这个:

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

答案 2 :(得分:0)

对我来说,最好的方法就是不删除旧行,而只是替换旧行。

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

如果您需要删除顶行下方的其他行,请保留记录以免数据重叠。

var removed = 0; // removed cels
if (indexToBeDeleted == condition)
    {
    var rowD = sheet.GetRow(indexToBeDeleted - removed);
    if (rowD != null)
        {
            sheet.ShiftRows(rowD.RowNum + 1, sheet.LastRowNum, -1);
            removed++;
        }
    }