在删除20,000+行Excel文件中的第一行时,出现Open XML SDK v2.0性能问题

使用OpenXML SDK v2.0删除20,000+行Excel文件中的第一行时,是否遇到任何性能问题?

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

我终于发现,瓶颈实际上是在处理行删除的泡沫式的方法。 删除的行后面有很多行更新。 所以在我的情况下,大约有20,000行被更新,逐行移动数据。

我想知道是否有更快的方式做行删除。

有人有想法吗?

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

您可能会获得稍微更好的性能,将SDK自身移到System.IO.Packaging ,只需在所有行的类似Linq-to-XML中创build一个IEnumerable / List ,将其复制到新的IEnumerable / List而不需要第一行,将<row r="?"/>r属性重写为索引中的位置,并将其写入<sheetData/>中的现有子项之上。

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

解压缩文件,操纵它并重新打包它的方法是非常错误的。

这个怎么样:如果你说,它在Excel中工作正常:你是否尝试过使用Interop? 这将启动Excel的新实例(可见或不可见),然后可以打开文件,删除行,保存并再次closures应用程序。

 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的索引来处理! 更多的资源看看这个StackOverflow线程 。