2011-12-22 16 views
4

複雑なオブジェクト(ツリー構造)をデータシートに展開してExcelシートに表示します。 Datatableは巨大で、約20000行と10000列を持っています。vsto excel workbook project:大量のデータテーブルをExcelシートに書き込む方法

データをExcelセルに1つずつ書き込むことは、永遠に必要でした。ですから、私は複雑なオブジェクトをデータテーブルに変換し、それを以下のコードを使ってExcelシートに書き出しています。

エクセルシートに20K行×10K列のデータを1分未満でかなり速く書き込むことができますか?< 5分ですか?このタスクをすばやく完了するための最善の方法は何ですか。

環境:Visual Studioの2010年、VSTO Excelワークブックプロジェクト、.NET Frameworkの4.0、エクセル2010/2007

EDIT:データの

オリジナルソースは、JSON形式で残りのサービス応答です。私はその後、C#オブジェクトにjsonレスポンスをデシリアライズし、最終的にデータテーブルにフラット化します。 Excelシートにデータテーブルの書き込みにこのコードを使用

Excel.Range oRange; 
       var oSheet = Globals.Sheet3; 
       int rowCount = 1; 
       foreach (DataRow dr in resultsDataTable.Rows) 
       { 
        rowCount += 1; 
        for (int i = 1; i < resultsDataTable.Columns.Count + 1; i++) 
        { 
         // Add the header the first time through 
         if (rowCount == 2) 
         { 
          oSheet.Cells[1, i] = resultsDataTable.Columns[i - 1].ColumnName; 
         } 
         oSheet.Cells[rowCount, i] = dr[i - 1].ToString(); 
        } 
       } 

       // Resize the columns 
       oRange = oSheet.get_Range(oSheet.Cells[1, 1], 
           oSheet.Cells[rowCount, resultsDataTable.Columns.Count]); 
       oRange.EntireColumn.AutoFit(); 

最終解決: は、データテーブルの代わりに、2Dオブジェクトの配列を使用し、範囲にそれを書きました。

+0

resultsdataTableを.txtファイルに書き出してからインポートする方が簡単でしょうか?また、resultsDataTableがExcelでもリンク/インポートが可能なデータソースからのものである場合は、そのダイレクトモードを使用します。それは、セルごとの管理/ COMのシリアル化を排除します – rene

答えて

5

Excelのアニメーションを凍結することに加えて、あなたは、ボトルネックになるにバインドされてExcel.Rangeオブジェクト、をループ自分を救う、これはから来ているデータソースを与え、代わりにDatatableへの書き込みによって、に書き込むことができますa string[,]、ExcelはRangeに一度に書き込むことができます。 string[,]のループは、Excelセルをループするよりもはるかに高速です。

string[,] importString = new string[yourJsonSource.Rows.Count, yourJsonSource.Columns.Count]; 
//populate the string[,] however you can 
for (int r = 0; r < yourJsonSource.Rows.Count; r++) 
{ 
    for (int c = 0; c < yourJsonSource.Columns.Count; c++) 
    { 
     importString[r, c] = yourJsonSource[r][c].ToString(); 
    } 
} 

var oSheet = Globals.Sheet3; 
Excel.Range oRange = oSheet.get_Range(oSheet.Cells[1, 1], 
      oSheet.Cells[yourJsonSource.Rows.Count, yourJsonSource.Columns.Count]); 
oRange.Value = importString; 
1

VSTOには常に時間がかかります。データを入力するときにシートのリフレッシュを無効にすることをおすすめします。これを行う方法の1つは「モーダル」の進行状況ダイアログボックスをポップアップし、 、これにより50-70%のパフォーマンスが向上します。あなたができるもう一つはVSをsp1に更新することです。

5

私は仕事のためのデータテーブルを使用することについて話すことはできませんが、相互運用機能を使用したい場合、あなたは間違いなく、細胞によって細胞を書き込まないようにしたいです。代わりに、create a 2-d array, and write it at once to a range、これは非常に重要なパフォーマンスの向上を提供します。

もう1つの選択肢は、interopを完全に避けて、OpenXMLを使用することです。 Excel 2007以上で作業している場合は、通常はファイルを操作する方が適しています。

関連する問題