Вставка через буфер позволяет достичь просто ОФИГЕННОЙ скорости передачи данных.
Попробуйте в Excel добавить, скажем, 150 000 записей... Легче повеситься. Вставка же
через буфер длает это за пару секунд.
Код:
procedure PasteToColumn(var Buf:string; x,count:integer; Var Sheet:variant);
var
IR2,IR1: ExcelRange;
begin
Clipboard.AsText:=Buf;
IDispatch(IR1):=Sheet.Cells.Item[1, x];
IDispatch(IR2):=Sheet.Cells.Item[count, x];
OLEVariant(Sheet.Range[IR1, IR2]).PasteSpecial;
Clipboard.Clear;
Buf:='';
end;
procedure TForm1.ExportToExcel(FileName:string);
var
XLApp,Sheet:Variant;
index,x:Integer;
str,Buf:string;
begin
try
Buf:='';
XLApp:= CreateOleObject('Excel.Application'); //Создаем Excel Application
XLApp.Visible:=true; //Показываем его
XLApp.Workbooks.Add(-4167); //добавляем книгу
XLApp.Workbooks[1].WorkSheets[1].Name:='Отчёт';
Sheet:=XLApp.Workbooks[1].WorkSheets['Отчёт'];
AssignFile(input,filename);
Reset(input); //открываем файл на чтение
index:=1;
x:=1;
while not eof(input) do begin
Readln(str);
Buf:=Buf+str+#9#10;
if index mod 65536=0 then begin //если дошли до конца столбца (Excel), то копируем то что в буфере в этот столбец
PasteToColumn(Buf,x,65536,Sheet);
x:=x+1; //далее будем добавлять в другой столбец
index:=0;
application.ProcessMessages;
end;
index:=index+1;
end;
PasteToColumn(Buf,x,index,Sheet); //если что то осталось, то вставляем оставшееся
CloseFile(input);
except
CloseFile(input);
showmessage('Ошибка при экспорте данных');
end;
end;