C#ExcelPackage(EPPlus)DeleteRow不更改图纸尺寸?

C#ExcelPackage(EPPlus)DeleteRow不更改图纸尺寸?,c#,epplus,excelpackage,C#,Epplus,Excelpackage,我正在尝试构建一个数据导入工具,该工具接受用户提供的EXCEL文件,并解析该文件中的数据,以便将数据导入到我的应用程序中 我在DeleteRow上遇到了一个奇怪的问题,我似乎无法在网上找到任何信息,尽管似乎有人以前会遇到这个问题。如果这是一个重复的问题,我道歉,但是我在搜索网页后找不到任何与我的问题相关的东西,除了仍然没有解决我的问题 因此,问题是: 我使用以下代码试图通过ExcelPackage“删除”任何包含空白数据的行 for (int rowNum = 1

我正在尝试构建一个数据导入工具,该工具接受用户提供的EXCEL文件,并解析该文件中的数据,以便将数据导入到我的应用程序中

我在DeleteRow上遇到了一个奇怪的问题,我似乎无法在网上找到任何信息,尽管似乎有人以前会遇到这个问题。如果这是一个重复的问题,我道歉,但是我在搜索网页后找不到任何与我的问题相关的东西,除了仍然没有解决我的问题

因此,问题是:

我使用以下代码试图通过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之后,ws.Dimension.End.Row仍将返回原始行数

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


谢谢

我想我解决了这个问题。这又是C#中的另一个闭包问题。问题是对“ws”的引用仍然是DeleteRow调用之前的引用

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

 ws = excelPackage.Workbook.Worksheets.First();
一旦获得对工作表的新引用,它将具有更新的维度,包括任何删除/添加的行/列


希望这对某人有所帮助。

你试过存钱吗?此外,Excel不受工作表中实际存储的行数或列数的影响。如果为计算或填充指定更大的范围,它将正常工作。没有删除的行,只有空行在excel中保存文件?当然,我在excel中保存了该文件……但是当我上传最后5个“空行”的文件,并使用ExcelPackage执行上述代码删除这5行时(我的目的是删除这些行,类似于excel中“删除并上移行”的方式,EPPlus方法甚至将该选项作为参数提供),即使在使用这5行ID调用DeleteRow之后,文件的维度仍然显示这5行在文档中。在调用维度之前,有没有一种方法可以让我在EPPlus中“保存”工作表(ws)?关键是-这不重要!在代码中保存工作表后,它应该删除多余的行。但这仍然无关紧要,因为它完全可以对空的单元格和行进行寻址。如果您的数据从第10行开始呢?你认为1-9被删除了吗?为什么这个问题?你想解决的问题有不同吗?您是否遇到其他问题并认为删除行就是答案?我认为您误解了…如果第1-9行为空(如该行中没有包含非空数据的单元格),它将调用该行号上的DeleteRow。我终于解决了这个问题。这是我的for循环中的一个闭包问题。我仍然需要弄清楚如何处理这个问题,因为一旦“删除”一行,就必须调用:ws=excelPackage.Workbook.Worksheets.First();再次获取工作表的新引用。如果您在这个问题上调用dimension,它将返回正确的行数(包括删除的行)。请注意,感谢您为您自己(有些模糊)的问题提供了答案。这样做可能节省了我很多时间。我欠你一杯啤酒!
 ws = excelPackage.Workbook.Worksheets.First();