![]() |
|
#3
|
|||
|
|||
![]() Вставка через буфер позволяет достичь просто ОФИГЕННОЙ скорости передачи данных.
Попробуйте в 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; |