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のようなものを使用することに反対しません。
SSISを使用したことがありますか?あなたはエクスポート、変換(私はあなたがIEnumerableで行っていると仮定)とExcelにインポートを処理するパッケージを作成することができます。 –
私は中期的に感謝します - 私はトランザクションを分割して一度に約2k個のレコードにデータをプッシュします。上記の同じデータ量の処理に約25秒しかかからないため、Excelがうまくバッファーされないとします。 –