7

OpenXML SDK v2.0 を使用して 20,000 行以上の Excel ファイルの最初の行を削除すると、パフォーマンスの問題に遭遇する人はいますか?

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

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

行の削除を行うためのより高速な方法があるかどうか疑問に思います。

誰にもアイデアはありますか?

4

2 に答える 2

4

ここでの悪いニュースは、そうです、その通りです

SDK自体の外に移動して、すべての行のLinq-to-XMLのように/ inSystem.IO.Packagingを作成し、最初の行なしで新しい/にコピーし、属性を書き直して、その場所になるようにすると、パフォーマンスがわずかに向上する場合がありますインデックス、および既存の子を上書きする書き込み。IEnumerableListIEnumerableListr<row r="?"/><sheetData/>

sharedStrings.xmlファイル内のすべての文字列に対して同じことを行う必要があります。つまり<ssi>.<si>、削除された行にあった要素を削除しますが、この場合、それらは暗黙的にインデックス付けされているため、それらを完全に削除するだけで済みます。

于 2010-07-23T22:13:57.263 に答える
0

ファイルを解凍し、操作し、再パックするというアプローチは、非常にエラーを排除します。

これはどうですか: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();
}

Rangeオブジェクトは、多くの目的に適しています。要素を削除するためにも。ご覧ください:MSDN範囲-説明。もう1つのヒント:相互運用機能はExcelを使用するため、すべてのオブジェクトを1ベースのインデックスで処理する必要があります。その他のリソースについては、このStackOverflow-threadをご覧ください。

于 2012-09-27T19:49:11.220 に答える