【问题标题】:C# ExcelPackage (EPPlus) DeleteRow does not change sheet dimension?C# ExcelPackage (EPPlus) DeleteRow 不改变工作表尺寸?
【发布时间】:2016-05-19 17:51:51
【问题描述】:

我正在尝试构建一个数据导入工具,它接受来自用户的 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”有什么意义?对此的任何见解将不胜感激......

谢谢

【问题讨论】:

  • 你试过保存吗?此外,Excel 不受工作表中实际存储的行数或列数的影响。如果您为计算或填充指定更大的范围,它将正常工作。没有删除行,只有空行
  • 在excel中保存文件?当然,我将文件保存在 excel 中...但是当我上传带有最后 5 个“空白行”的文件,并使用 ExcelPackage 执行上述代码以 delete 这 5 行时(我的意图 is 删除这些行,类似于在 excel 中“删除并向上移动行”,EPPlus 方法甚至将该选项作为参数提供),文件的维度仍将这 5 行显示为在文档中,即使在使用这 5 个行 ID 调用 DeleteRow 之后也是如此。在调用维度之前,我应该在 EPPlus 中“保存”工作表(ws)吗?
  • 重点是——没关系!一旦您将工作表保存在您的代码中,它应该会删除多余的行。但这仍然无关紧要,因为寻址单元格是空的行是完全有效的。如果您的数据从第 10 行开始呢?您会认为 1-9 已删除吗?
  • 为什么要问这个问题?您是否正在尝试解决其他问题?您是否遇到其他问题并认为删除行是答案?
  • 我认为您误解了...如果第 1-9 行是空白的(因为该行中没有包含非空数据的单元格),它将在该行号上调用 DeleteRow。我终于弄清楚了这个问题。这是我的 for 循环中的一个关闭问题。我仍然必须弄清楚我将如何处理这个问题,因为看起来一旦你“删除”一行,你就必须调用:ws = excelPackage.Workbook.Worksheets.First();再次获取对工作表的新引用。如果您对此调用维度,它将返回正确的行数(包含已删除的行)。

标签: c# epplus excelpackage


【解决方案1】:

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

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

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

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

希望这对某人有所帮助。

【讨论】:

  • 请注意,感谢您发布对您自己(有些晦涩)问题的答案。这样做可能为我节省了很多时间。我欠你一杯啤酒!
猜你喜欢
  • 1970-01-01
  • 2016-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多