1

16000 x 12 のエントリを持つかなり高度なデータセットをワークシートにダンプする必要があります。

現在、次の関数を使用しています。

        for (int r = 0; r < dt.Rows.Count; ++r)
        {
            for (int c = 0; c < dt.Columns.Count; ++c)
            {
                worksheet.Cells[c + 1][r + 1] = dt.Rows[r][c].ToString();
            }
        }

例を中央のピースに作り直しました


Dave Zychからの提案を読んだ後に実装したものを次に示します。これはうまくいきます。

    private static void AppendWorkSheet(Excel.Workbook workbook, DataSet data, String tableName)
    {
        Excel.Worksheet worksheet;
        if (UsedSheets == 0) worksheet = workbook.Worksheets[1];
        else worksheet = workbook.Worksheets.Add();
        UsedSheets++;
        DataTable dt = data.Tables[0];
        var valuesArray = new object[dt.Rows.Count, dt.Columns.Count];

        for (int r = 0; r < dt.Rows.Count; ++r)
        {
            for (int c = 0; c < dt.Columns.Count; ++c)
            {
                valuesArray[r, c] = dt.Rows[r][c].ToString();
            }
        }
        Excel.Range c1 = (Excel.Range)worksheet.Cells[1, 1];
        Excel.Range c2 = (Excel.Range)worksheet.Cells[dt.Rows.Count, dt.Columns.Count];
        Excel.Range range = worksheet.get_Range(c1, c2);
        range.Cells.Value2 = valuesArray;
        worksheet.Name = tableName;
    }
4

1 に答える 1

5

から値の 2D 配列を作成するDataSetと、Excel で値の範囲を配列の値に設定できます。

object valuesArray = new object[dataTable.Rows.Count, dataTable.Columns.Count];
for(int i = 0; i < dt.Rows.Count; i++)
{
    //If you know the number of columns you have, you can specify them this way
    //Otherwise use an inner for loop on columns
    valuesArray[i, 0] = dt.Rows[i]["ColumnName"].ToString();
    valuesArray[i, 1] = dt.Rows[i]["ColumnName2"].ToString();
    ...
}

//Calculate the second column value by the number of columns in your dataset
//"O" is just an example in this case
//Also note: Excel is 1 based index
var sheetRange = worksheet.get_Range("A2:O2", 
    string.Format("A{0}:O{0}", dt.Rows.Count + 1));

sheetRange.Cells.Value2 = valuesArray;

これは、ループして各セルを個別に設定するよりもはるかに高速です。各セルを個別に設定している場合は、セルごとに (より適切なフレーズがないため) COM を介して Excel と通信する必要があり (この場合は ~192,000 回)、これは非常に低速です。ループして配列を構築し、一度だけ Excel と対話することで、そのオーバーヘッドの多くが取り除かれます。

于 2012-11-01T19:40:48.450 に答える