我正在尝试构建一个数据导入工具,它接受用户的 EXCEL 文件并解析文件中的数据以将数据导入到我的应用程序中。
我在删除行时遇到了一个奇怪的问题,我似乎无法在网上找到任何信息,尽管似乎以前有人遇到过这个问题。如果这是一个重复的问题,我很抱歉,但是在搜索网络后我找不到与我的问题相关的任何内容,除了this one https://stackoverflow.com/questions/34089677/how-can-i-get-actual-used-range-for-modified-excels-using-epplus这仍然没有解决我的问题。
所以问题是:
我使用以下代码尝试通过 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);
即使在调用DeleteRow之后,ws.Dimension.End.Row仍将返回原始行计数。
我的问题是......我是否必须“保存”工作表或调用某些内容才能使工作表意识到这些行已被删除?如果该行仍然“存在”,那么调用“DeleteRow”有什么意义?对此的任何见解将不胜感激......
Thanks
我想我找到了问题所在。这又是 C# 中的另一个闭包问题。问题在于对“ws”的引用仍然与调用DeleteRow 之前的引用相同。
为了获得“更新”的维度,您必须重新声明工作表,例如:
ws = excelPackage.Workbook.Worksheets.First();
一旦您获得对工作表的新引用,它将具有更新的维度,包括任何删除/添加的行/列。
希望这对某人有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)