C# NPOI Excel 工具不删除行?
C# NPOI Excel tool does not remove the row?
我正在开发一个应用程序,它应该从文件末尾读取一行,对其进行处理,然后删除该行并更新文件。
我正在使用 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 方法似乎效果不佳。查看提交的错误 here。
您希望该行被删除,下面的其余行将 "move up"。其实那是MSExcel为你做的。
对于一个数据结构,NPOI并没有把剩下的行向上移动,它只是把那一行的所有单元格都移除,即使移除的行本身在"remove"之后不为空,它只是没有单元格。
试试这个:
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);
}
对我来说最好的方法就是不删除旧行,而只是替换旧行。
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++;
}
}
我正在开发一个应用程序,它应该从文件末尾读取一行,对其进行处理,然后删除该行并更新文件。
我正在使用 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 方法似乎效果不佳。查看提交的错误 here。
您希望该行被删除,下面的其余行将 "move up"。其实那是MSExcel为你做的。 对于一个数据结构,NPOI并没有把剩下的行向上移动,它只是把那一行的所有单元格都移除,即使移除的行本身在"remove"之后不为空,它只是没有单元格。
试试这个:
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);
}
对我来说最好的方法就是不删除旧行,而只是替换旧行。
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++;
}
}