7

在使用 OpenXML SDK v2.0 删除超过 20,000 行 Excel 文件中的第一行时,是否有人遇到过性能问题?

我正在使用 Open XML SDK 文档中建议的删除行编码。使用 Open XML SDK 删除第一行需要几分钟,但在 Excel 应用程序中只需要一秒钟。

我最终发现瓶颈实际上是处理行删除的冒泡方法。删除行后有很多行更新。所以在我的例子中,大约有 20,000 行需要更新,逐行向上移动数据。

我想知道是否有更快的方法来删除行。

有人有想法吗?

4

2 回答 2

4

好吧,这里的坏消息是:是的,就是这样

您可能会获得稍微更好的性能,将 SDK 本身移到所有行System.IO.PackagingIEnumerable/List中,就像 Linq-to-XML 一样,将其复制到没有第一行的新IEnumerable/中,重写属性以将其放置在索引,并将其写回到现有子代的内部。Listr<row r="?"/><sheetData/>

您需要对sharedStrings.xml文件中的任何字符串执行相同的操作 - 即删除<ssi>.<si>已删除行中的元素,但在这种情况下,它们现在已被隐式索引,因此您可以只需彻底删除它们即可逃脱。

于 2010-07-23T22:13:57.263 回答
0

解压缩文件、操作文件和重新打包文件的方法非常容易出错。

这个怎么样:如果你说它在 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

于 2012-09-27T19:49:11.220 回答