Ускорить работу с Excel

Первые опыты работы с Excel из Delphi обычно выглядят как-то так:

var
  Excel: OleVariant;
begin
...
  // Запускаем Excel
  Excel:=CreateOleObject('Excel.Application');
...
  // Как-то получаем лист, например, создаём
  Excel.WorkBooks.Add;
  Excel.WorkBooks.Item[1].Sheets.Add;
...    
  // И теперь можно заполнять ячейки
  Excel.WorkBooks.Item[1].Sheets[1].Cells[1,1] := 'Таблица умножения';
...
  // А когда нужно заполнить миллион ячеек, то...
  for i:=1 to 1000 do
    for j:=1 to 1000 do
      Excel.WorkBooks.Item[1].Sheets[1].Cells[i+2,j+2] := IntToStr(i*j);

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

Выход - писать и читать данные большими порциями:

var
  Parcel : Variant;
  Sheet, Range: OLEVariant;
begin
  ...
  // Создаём массив вариантов
  Parcel := VarArrayCreate([1, 1000, 1, 1000], varVariant);
  // Заполняем
  for i:=1 to 1000 do
    for j:=1 to 1000 do
      Parcel[i, j] := IntToStr(i*j);
  // Выделяем лист для удобства восприятия
  Sheet := Excel.WorkBooks.Item[1].Sheets[1];
  // Получаем регион, который заполняем данными
  Range := Sheet.Range[Sheet.Cells[3,3], Sheet.Cells[1002, 1002]];
  Range.Value := Parcel; // Передаём миллион ячеек одним присваиванием

Ускорение будет на порядки. 

Подход к чтению аналогичен. Определяем диапазон, забираем одной порцией в массив вариантов, разбираем уже в Delphi.

 

Метки: