オープンXML SDK v2.0のパフォーマンスの問題20,000行Excelファイルの最初の行を削除するとき
-
18-09-2019 - |
質問
のOpenXML SDK v2.0のを使用して20,000行Excelファイルの最初の行を削除すると、誰もがパフォーマンスの問題に遭遇しますか?
私は、オープンXML SDKドキュメントで提案されている、削除行のコードを使用しています。それはちょうどオープンXML SDKを使用して最初の行を削除するには、私には数分かかりますが、それだけで、Excelのapplicatonでちょうど秒かかります。
私は最終的にボトルネックが行削除を扱うにバブルアップアプローチに実際にあることが分かりました。削除された行の後に更新する多くの行があります。だから、私の場合には、更新される約2万行は、行ごとにデータをシフトアップ、があります。
私は、行の削除を行うための任意のより高速な方法があるかどうだろうか。
誰もがアイデアを持っていますか?
解決
さて、ここで悪いニュースは、次のとおりです。のうん、それはそれはのある方法です。
。あなたはわずかに良いパフォーマンスがSystem.IO.Packaging
にSDK自体の外に移動するとちょうどLINQのツーXMLのすべての行のようでIEnumerable
/ List
を作成しますが、最初の行のない新しいIEnumerable
/ List
にあることをコピーし、書き換えなるようにr
の<row r="?"/>
属性は、それがインデックス内の場所、および既存の子の上に内部<sheetData/>
を書き戻します。
<ssi>.<si>
要素を取り除くすなわち、この場合には、彼らがしている - あなたは一種ののsharedStrings.xml のファイル内の任意の文字列のために同じことを行う必要があると思いますあなただけの完全にそれらを削除して逃げることができるだろうので今暗黙のうちに、インデックスを付けます。
他のヒント
、ファイルを解凍、それを操作し、それを再包装のアプローチは非常にエラープルーンです。
これはどう:あなたはそれを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();
}
レンジ・オブジェクトには、多くの目的のために資格があります。また、要素を削除します。見ています: MSDN範囲-説明>。もう一つのヒント:相互運用機能は、Excelを使用するため、すべてのオブジェクトは、1から始まるインデックスでadressedする必要があります! より多くのリソースについてはでこのStackOverflowのスレッドを見てみましょう。