删除 20,000+ 行 Excel 文件中的第一行时打开 XML SDK v2.0 性能问题
Posted
技术标签:
【中文标题】删除 20,000+ 行 Excel 文件中的第一行时打开 XML SDK v2.0 性能问题【英文标题】:Open XML SDK v2.0 Performance issue when deleting a first row in 20,000+ rows Excel file 【发布时间】:2009-12-10 01:58:19 【问题描述】:在使用 OpenXML SDK v2.0 删除 20,000 多行 Excel 文件中的第一行时,是否有人遇到过性能问题?
我正在使用 Open XML SDK 文档中建议的删除行编码。使用 Open XML SDK 删除第一行需要几分钟,但在 Excel 应用程序中只需要一秒钟。
我最终发现瓶颈实际上是处理行删除的冒泡方法。在删除的行之后有许多行更新。所以在我的例子中,大约有 20,000 行需要更新,逐行向上移动数据。
我想知道是否有更快的方法来删除行。
有人有想法吗?
【问题讨论】:
【参考方案1】:好吧,这里的坏消息是:是的,就是这样。
在 SDK 本身之外移动到 System.IO.Packaging
并且只需在所有行的 Linq-to-XML 中创建 IEnumerable
/List
时,您可能会获得稍好的性能,将其复制到新的 IEnumerable
/List
没有第一行,重写<row r="?"/>
的r
属性使其在索引中的位置,并将其写回<sheetData/>
中的现有子代。
您需要对 sharedStrings.xml 文件中的任何字符串执行相同的操作 - 即删除已删除行中的 <ssi>.<si>
元素,但在这种情况下它们现在已被隐式索引,因此您可以直接删除它们。
【讨论】:
【参考方案2】:解压缩文件、操作文件和重新打包文件的方法非常容易出错。
这个怎么样:如果您说它在 Excel 中工作正常:您是否尝试过使用 Interop?这将启动一个新的 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();
范围对象适用于多种用途。也用于删除元素。看看:MSDN Range-Description。另一个提示:Interop 使用 Excel,因此所有对象都必须使用从 1 开始的索引! 如需更多资源,请查看this ***-thread。
【讨论】:
以上是关于删除 20,000+ 行 Excel 文件中的第一行时打开 XML SDK v2.0 性能问题的主要内容,如果未能解决你的问题,请参考以下文章