2011-08-16 15 views
2

IEnumerableをExcel 2007(.xlsb)にエクスポートするための良い方法をお探しです。 Tは既知のタイプなので、パフォーマンス上の理由からリフレクションは完全に必要ではありません。 Excelのデータ量が大きくなるため、.xlsb(Excel形式のバイナリ形式)を使用しています。IEnumerable <T> to Excel(2007)書式設定

問題のIEnumerableには、約200万レコードがあります。 IEnumerableはAccessデータベース(.mdb)から取得され、その後いくつかの処理が行われ、最後にLINQクエリがTのレポート構造を生成するように書き込まれます。これらのレコードは、 ;最大レコード長が約100万レコードになる条件で再分割されます。

データをExcel Pivot Tableに簡単に変換できるようにする必要があります。

私の最初のアイデアは、IEnumerableを2D配列に変換し、次にCOM interopを使用してExcel範囲にプッシュすることでした。

public static object[,] To2DArray<T>(this IEnumerable<T> objectList) 
    { 
     Type t = typeof(T); 
     PropertyInfo[] fields = t.GetProperties(); 

     object[,] my2DObject = new object[objectList.Count(), fields.Count()]; 

     int row = 0; 

     foreach (var o in objectList) 
     { 
      int col = 0; 
      foreach (var f in fields) 
      { 
       my2DObject[row, col] = f.GetValue(o, null) ?? string.Empty; 
       col++; 
      } 
      row++; 
     } 

     return my2DObject; 
    } 

私は、そのオブジェクト[、]を取って、私はちょうど私がそれぞれ通過し、その後リストを作成したいのような[、]小さな塊にオブジェクトを分割され、それを呼ばれると「トランザクション分割を」やりました1と同様のものを使用してExcelの範囲に送信:私はループ上記を明らかにしたいが、ただ簡単にするために、それは上記のようになります

Excel.Range range = worksheet.get_Range(cell,cell); 
range.Value2 = List<object[,]>[0] 

。 これは動作しますが、30分以上処理するには膨大な時間がかかります。

私はCSnにIEnumerableを出力するのを手伝っていますが、あまり効率的ではありません。最初に.csvファイルを作成する必要があるため、COM interopを使用して.csvファイルを開き、Excelのピボットテーブルの書式設定を行います。

私の質問:これを行うには、(推奨)方法がありますか? 反復の前に強制的に実行(toList())する必要がありますか?

データを出力/表示するために別のメカニズムを使用する必要がありますか? 私は効率的にファイルに接続されていないIEnumerableを取得するために任意のオプションを開いています。

- 私はSQL Expressのようなものを使用することに反対しません。

+0

SSISを使用したことがありますか?あなたはエクスポート、変換(私はあなたがIEnumerableで行っていると仮定)とExcelにインポートを処理するパッケージを作成することができます。 –

+0

私は中期的に感謝します - 私はトランザクションを分割して一度に約2k個のレコードにデータをプッシュします。上記の同じデータ量の処理に約25秒しかかからないため、Excelがうまくバッファーされないとします。 –

答えて

0

主な質問は、ボトルネックがある場所です。私は実行のどの部分が長い時間を取っているかを見るためにプロファイラのコードを見ています。また、プロセスを実行してCPUやメモリが不足しているかどうか、またはディスクがロックされているかどうかを調べることで、リソースの使用状況を調べることも価値があります。 一度に2000レコードを実行する合理的なパフォーマンスが得られたら、メモリリソースが問題であると思われます。投稿したコードで、IEnumerable(完全なデータセットをメモリにロードするのを避けることができます)潜在的に100万のレコードを持つメモリ内の構造 - 関連するフィールドのサイズと数に応じて、これは簡単に問題になる可能性があります。 問題がExcelファイル自体を作成する時間(この場合はすぐには聞こえません)のように見える場合は、COM相互運用機能の呼び出しが追加され、サードパーティ製のExcelライブラリの一部が多くなることを目指しています特にExcelのバイナリ形式とCOMを使用するのではなく、EPPlus(http://epplus.codeplex.com/)のようなオープンソースライブラリを見てみることをお勧めしますパフォーマンスの違いは何ですか?