我正在尝试构建一个数据导入工具,该工具接受来自用户的EXCEL文件并解析文件中的数据以将数据导入我的应用程序。
我遇到了一个与DeleteRow有关的奇怪问题,我似乎无法在网上找到任何信息,尽管看起来有人会遇到过这个问题。如果这是一个重复的问题,我很抱歉,但是在搜索网页后找不到与我的问题有关的任何内容,除了this one仍未解决我的问题。
所以问题:
我使用以下代码尝试通过ExcelPackage“删除”包含空白数据的任何行。
for (int rowNum = 1; rowNum <= ws.Dimension.End.Row; rowNum++)
{
var rowCells = from cell in ws.Cells
where (cell.Start.Row == rowNum)
select cell;
if (rowCells.Any(cell => cell.Value != null))
{
nonEmptyRowsInFile += 1;
continue;
}
else ws.DeleteRow(rowNum);
//Update: ws.DeleteRow(rowNum, 1, true) also does not affect dimension
}
单步执行该代码,我可以看到DeleteRow确实被调用了正确的行号,但问题是当我在返回的结果对象上设置“文件中的总行数”时:
parseResult.RowsFoundInFile = (ws.Dimension.End.Row);
ws.Dimension.End.Row即使在调用DeleteRow之后仍会返回原始行数。
我的问题是......我是否必须“保存”工作表或调用某些内容才能让工作表意识到这些行已被删除?如果行仍然“存在”,调用“DeleteRow”有什么意义?任何有关这方面的见解将不胜感激......
由于
答案 0 :(得分:7)
我想我弄明白了这个问题。这又是C#中的另一个关闭问题。问题是对“ws”的引用仍然是DeleteRow调用之前的引用。
要获得“更新”维度,您必须重新声明工作表,例如:
ws = excelPackage.Workbook.Worksheets.First();
获得对工作表的新引用后,它将具有更新的维度,包括任何已删除/添加的行/列。
希望这有助于某人。