Самый быстрый способ поместить набор данных на лист

Довольно большой набор данных с 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;
    }

person Johannes    schedule 01.11.2012    source источник


Ответы (1)


Создайте 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;

Это намного, намного быстрее, чем зацикливание и настройка каждой ячейки по отдельности. Если вы настраиваете каждую ячейку по отдельности, вам нужно общаться с Excel через COM (из-за отсутствия лучшей фразы) для каждой ячейки (что в вашем случае ~ 192 000 раз), что невероятно медленно. Зацикливание, построение массива и обращение к Excel только один раз устраняет большую часть этих накладных расходов.

person Dave Zych    schedule 01.11.2012
comment
вау, спасибо - сбросил все данные меньше чем в мгновение ока. - person Johannes; 02.11.2012