2009-12-10 24 views
7

在使用OpenXML SDK v2.0刪除20,000+行Excel文件中的第一行時,是否遇到任何性能問題?Open XML SDK v2.0性能問題,當刪除20,000+行的第一行時Excel文件

我正在使用Open XML SDK文檔中建議的刪除行編碼。我需要幾分鐘時間才能使用Open XML SDK刪除第一行,但在Excel應用程序中僅需要一秒鐘。

我終於發現,瓶頸實際上是在處理行刪除的泡沫式方法。在刪除的行後面有很多行更新。所以在我的情況下,大約有20,000行被更新,逐行移動數據。

我不知道是否有更快的方式來刪除行。

有人有想法嗎?

回答

4

那麼,這裏的壞消息是:是的,這就是它的方式

你可能會表現稍好的SDK本身以外遷入System.IO.Packaging,只是像LINQ到XML的所有行創建IEnumerable/List,複製到一個新的IEnumerable/List沒有第一行,將<row r="?"/>r屬性重寫爲它在索引中的位置,並將<sheetData/>寫回到現有子項中。

你需要那種做任何字符串相同的sharedStrings.xml文件 - 即除去了被刪除的行中的<ssi>.<si>的元素,但在這種情況下,他們現在隱含索引,所以你只需徹底移除它們就可以逃脫。

0

解壓縮文件,操作它並重新打包它的方法非常錯誤。

這個怎麼樣:如果你說,它在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(); 
} 

Range-object限定用於多種用途。也用於刪除元素。看看:MSDN Range-Description。還有一點提示:Interop使用Excel,因此所有對象都必須使用基於1的索引來處理! 欲瞭解更多資源,請看this StackOverflow-thread