Показать сообщение отдельно
  #3  
Старый 09.07.2008, 15:05
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

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