Проект рабочей книги Excel: Как довольно быстро записать ОГРОМНЫЕ датированные данные в таблицу Excel - PullRequest
4 голосов
/ 22 декабря 2011

У меня есть сложный объект (древовидная структура), который я сплющиваю в виде данных, чтобы отобразить его на листе Excel.Datatable огромен и имеет около 20000 строк и 10000 столбцов.

Запись данных в ячейку Excel по одному заняла целую вечность.Итак, я преобразовываю сложный объект в таблицу данных, а затем записываю его на лист Excel с помощью приведенного ниже кода.

Можно ли довольно быстро записать данные из столбцов размером 20К строк и 10К в лист Excel?минута или <5 минут?Как лучше всего быстро выполнить эту задачу. </p>

Среда: Visual studio 2010, проект книги VSTO Excel, .NET Framework 4.0, Excel 2010/2007

РЕДАКТИРОВАТЬ:

Первоначальный источник данных - ответ службы покоя в формате json.Затем я десериализирую ответ json на объекты c # и, наконец, объединяю его в таблицу данных.

Использование этого кода для записи данных в таблицу 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();

Окончательное решение: Использовал массив двумерных объектов вместо данных и записал его в диапазон.

Ответы [ 3 ]

5 голосов
/ 23 декабря 2011

В дополнение к заморозке анимации в Excel вы можете, учитывая источник данных, из которого он исходит, сохранить себя зацикливаясь на объекте Excel.Range, который является узким местом, вместо записи в Datatable Записать в 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;
5 голосов
/ 26 декабря 2011

Я не могу говорить об использовании таблицы данных для работы, но если вы хотите использовать Interop, вам определенно нужно избегать записи ячейка за ячейкой. Вместо этого создайте двумерный массив и сразу запишите его в диапазон , что даст вам очень значительное улучшение производительности.

Другой вариант, который вам следует рассмотреть, - это вообще избегать взаимодействия и использовать OpenXML . Если вы работаете с Excel 2007 или более поздней версией, обычно это лучший подход для работы с файлами.

1 голос
/ 23 декабря 2011

VSTO всегда будет занимать время, лучший совет, которым я могу поделиться с вами, - отключить обновление листа при заполнении данных. Один из способов сделать это - открыть диалоговое окно «Модальное» и обновить фон в листе,это даст вам на 50-70% лучшую производительность.Еще одна вещь, которую вы можете сделать, это обновить VS до sp1, это помогает.

...