Самый быстрый способ записать ячейки в Excel с Office Interop?

Я пишу функцию для экспорта данных в Excel с помощью Office Interop в.NET VB. Я в настоящее время пишу ячейки непосредственно с помощью Ячеек рабочего листа Excel () метод:

worksheet.Cells(rowIndex, colIndex) = data(rowIndex)(colIndex)

Это занимает много времени для больших объемов данных. Существует ли более быстрый способ записать много данных к Excel сразу? Был бы, делая что-то с диапазонами быть быстрее?

14
задан davidscolgan 22 June 2010 в 18:38
поделиться

4 ответа

Вам следует избегать чтения и записи ячейки за ячейкой, если это возможно. Гораздо быстрее работать с массивами и читать или записывать сразу целые блоки. Некоторое время назад я писал статью о чтении из рабочих листов с помощью C#; в принципе, тот же код работает и в обратном направлении (см. ниже), и будет работать намного быстрее, особенно с большими блоками данных.

  var sheet = (Worksheet)Application.ActiveSheet;
  var range = sheet.get_Range("A1", "B2");
  var data = new string[3,3];
  data[0, 0] = "A1";
  data[0, 1] = "B1";
  data[1, 0] = "A2";
  data[1, 1] = "B2";
  range.Value2 = data;
29
ответ дан 1 December 2019 в 06:20
поделиться

Если вы еще этого не сделали, не забудьте установить Application.ScreenUpdating = false , прежде чем начинать вывод данных. Так дела пойдут намного быстрее. Установите его обратно в True, когда вы закончите вывод данных. Необходимость перерисовывать экран при каждом изменении ячейки занимает немало времени, игнорирование этого позволяет сэкономить.

Что касается использования диапазонов, вам все равно нужно будет указать 1 (одну) конкретную ячейку для значения, поэтому я не вижу здесь никакой выгоды. Я не знаю, что делать это быстрее, чем то, что вы делаете в отношении фактического вывода данных.

10
ответ дан 1 December 2019 в 06:20
поделиться

Просто чтобы добавить к ответу Томми.

  • Возможно, вы также захотите установить вычисление в ручном режиме, прежде чем начнете писать.

Application.Calculation = xlCalculationManual

И установите его обратно в автоматический режим, когда закончите писать. (если есть вероятность того, что исходный режим мог быть не автоматическим, вам придется сохранить это значение перед установкой ручного режима)

Application.Calculation = xlCalculationAutomatic

  • Можно также использовать метод CopyFromRecordset объекта Range.

http://msdn.microsoft.com/de-de/library/microsoft.office.interop.excel.range.copyfromrecordset(office.11).aspx

5
ответ дан 1 December 2019 в 06:20
поделиться

Честно говоря, самый быстрый способ написать это с разделителями-запятыми. С помощью метода Join (","). ToString проще написать строку полей, чем пытаться перебирать ячейки. Затем сохраните файл как «.csv». Используя interop, откройте файл как csv, который автоматически обновит ячейку при открытии.

2
ответ дан 1 December 2019 в 06:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: