在使用 OpenXML SDK v2.0 删除超过 20,000 行 Excel 文件中的第一行时,是否有人遇到过性能问题?
我正在使用 Open XML SDK 文档中建议的删除行编码。使用 Open XML SDK 删除第一行需要几分钟,但在 Excel 应用程序中只需要一秒钟。
我最终发现瓶颈实际上是处理行删除的冒泡方法。删除行后有很多行更新。所以在我的例子中,大约有 20,000 行需要更新,逐行向上移动数据。
我想知道是否有更快的方法来删除行。
有人有想法吗?
在使用 OpenXML SDK v2.0 删除超过 20,000 行 Excel 文件中的第一行时,是否有人遇到过性能问题?
我正在使用 Open XML SDK 文档中建议的删除行编码。使用 Open XML SDK 删除第一行需要几分钟,但在 Excel 应用程序中只需要一秒钟。
我最终发现瓶颈实际上是处理行删除的冒泡方法。删除行后有很多行更新。所以在我的例子中,大约有 20,000 行需要更新,逐行向上移动数据。
我想知道是否有更快的方法来删除行。
有人有想法吗?
好吧,这里的坏消息是:是的,就是这样。
您可能会获得稍微更好的性能,将 SDK 本身移到所有行System.IO.Packaging
的IEnumerable
/List
中,就像 Linq-to-XML 一样,将其复制到没有第一行的新IEnumerable
/中,重写属性以将其放置在索引,并将其写回到现有子代的内部。List
r
<row r="?"/>
<sheetData/>
您需要对sharedStrings.xml文件中的任何字符串执行相同的操作 - 即删除<ssi>.<si>
已删除行中的元素,但在这种情况下,它们现在已被隐式索引,因此您可以只需彻底删除它们即可逃脱。
解压缩文件、操作文件和重新打包文件的方法非常容易出错。
这个怎么样:如果你说它在 Excel 中运行良好:你尝试过使用互操作吗?这将启动一个新的 Excel 实例(可见或不可见),然后您可以打开文件、删除行、保存并再次关闭应用程序。
using System;
using System.IO;
using Microsoft.Office.Interop.Excel;
using Excel = Microsoft.Office.Interop.Excel;
public void OpenAndCloseExcel()
{
Excel.Application excelApp = new Excel.Application();
// Open Workbook, open Worksheet, delete line, Save
excelApp.Quit();
}
Range-object 适用于多种用途。也用于删除元素。看看:MSDN Range-Description。另一个提示:Interop 使用 Excel,因此所有对象都必须使用从 1 开始的索引!有关更多资源,请查看此 StackOverflow-thread。