2009-12-10 5 views
7

OpenXML SDK v2.0を使用して20,000以上の行のExcelファイルの最初の行を削除すると、オープンXML SDK v2.0 20,000以上の行の最初の行を削除するときのパフォーマンスの問題Excelファイル

私はOpen XML SDKドキュメントで推奨されている削除行コーディングを使用しています。 Open XML SDKを使用して最初の行を削除するだけで数分かかりますが、Excelアプリケーションではわずか1秒しかかかりません。

結局のところ、ボトルネックは行の削除を処理する際のバブルアップ手法になっていることがわかりました。削除された行の後には多くの行が更新されます。したがって、私の場合は、更新される行は約20,000行あり、行ごとにデータをシフトします。

私は行削除を行うより速い方法があるのだろうかと思います。

アイデアはありますか?

答えて

4

ここでの悪いニュースは、です。それはです。

は、あなたがわずかに良いパフォーマンスがSystem.IO.PackagingにSDK自体の外に移動するとちょうどLINQのツーXMLすべての行のようにIEnumerable/Listを作成するかもしれません、コピー、最初の行のない新しいIEnumerable/Listに、 r属性を<row 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オブジェクトは多くの目的で修飾されています。また、要素を削除する。見てください:MSDN Range-Description。もう1つのヒント:InteropはExcelを使用しているので、すべてのオブジェクトに1ベースのインデックスを付けなければなりません! 詳細についてはthis StackOverflow-threadをご覧ください。

関連する問題