【问题标题】:Open XML SDK v2.0 Performance issue when deleting a first row in 20,000+ rows Excel file删除 20,000+ 行 Excel 文件中的第一行时打开 XML SDK v2.0 性能问题
【发布时间】:2009-12-10 01:58:19
【问题描述】:

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

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

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

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

有人有想法吗?

【问题讨论】:

    标签: performance excel openxml-sdk openxml


    【解决方案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 StackOverflow-thread

      【讨论】:

        猜你喜欢
        • 2014-05-17
        • 1970-01-01
        • 1970-01-01
        • 2011-11-07
        • 2021-08-10
        • 2016-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多