C# ExcelPackage (EPPlus) DeleteRow 不改变工作表尺寸?

标签 c# epplus excelpackage

我正在尝试构建一个数据导入工具,它接受来自用户的 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);

即使在调用 DeleteRow 之后,ws.Dimension.End.Row 仍将返回原始行数。

我的问题是......我是否必须“保存”工作表或调用某些东西才能让工作表意识到这些行已被删除?如果该行仍然“存在”,则调用“DeleteRow”有什么意义?对此的任何见解将不胜感激......

谢谢

最佳答案

我想我找到了问题所在。这又是 C# 中的另一个闭包问题。问题是对“ws”的引用仍然与 DeleteRow 调用之前的引用相同。

为了获得“更新”维度,您必须重新声明工作表,例如:

 ws = excelPackage.Workbook.Worksheets.First();

获得对工作表的新引用后,它将具有更新的维度,包括任何删除/添加的行/列。

希望这有助于某人。

关于C# ExcelPackage (EPPlus) DeleteRow 不改变工作表尺寸?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35297236/

相关文章:

c# - 获取USB设备的产品字符串(C#/C++)

c# - 如何将 TableLayoutPanel 的底行滚动到 View 中

c# - 使用 EPPLus 获取合并的单元格区域

asp.net - 在 EPPlus 中格式化列以使用电话号码格式

c# - 如何以编程方式从模板 excel 工作表创建 excel 工作表?

c# - 从它的 child 调用(显示)位于 MasterPage 中的模式弹出窗口

c# - AddPicture 有替代品吗? (C#,Epplus)

c# - 无法使用 C# 使用 ExcelPackage 创建带撇号的 XLSX

javascript - .NET C# 使用 ExcelPackage 通过 JS post 导出到 excel

c# - .NET 4 中的比较器<T>.Create