Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.09.27;
Скачать: CL | DM;

Вниз

Ускорить экспорт в Excel   Найти похожие ветки 

 
ANTPro_ ©   (2015-01-27 08:35) [0]

Всем привет!
Есть приложение которое экспортирует данные в Excel.
Открывает шаблон и вставляет через буфер обмена.
Проблема в том что это происходит крайне медленно(вставка 3000 записей занимает 15 минут)
Как можно ускорить экспорт?


 
brother ©   (2015-01-27 08:40) [1]

использовать OLE?


 
ANTPro_ ©   (2015-01-27 08:41) [2]

Ах, да забыл написать, что исходников приложения нет.


 
brother ©   (2015-01-27 08:57) [3]

Тогда: откиньтесь на спинку кресла и ждите пока ... (с)SetupWin98


 
junglecat ©   (2015-01-27 09:28) [4]

Удалено модератором


 
Jeer ©   (2015-01-27 09:54) [5]

Удалено модератором


 
junglecat ©   (2015-01-27 10:02) [6]

Удалено модератором


 
ANTPro_ ©   (2015-01-27 11:11) [7]

Судя по API монитору OLE уже используется.


 
кгшзх ©   (2015-01-27 11:22) [8]

заменить поячеечное присвоение (а судя по скорости там именно оно) значений на:
взять двумерный рэйндж в листе и присвоить ему двумерный vb-массив


 
ANTPro_ ©   (2015-01-27 11:52) [9]

Вставка построчная(Так как в буфере обмена 1 запись на строку)


 
кгшзх ©   (2015-01-27 11:56) [10]

ну так в буфере строка, а дальше цикел по полям/ячейкам.
это и будет очень долго.
как ускорить без переписывания - наверное никак.
если можно вынуть данные в файл, то как вариант запустить через шелл какой-нить скрипт на vbs который сформирует двумерный массив и присвоит его выбранному диапазону листа.
это будет один вызов и это будет быстро


 
Jeer ©   (2015-01-27 15:44) [11]

Удалено модератором


 
картман ©   (2015-01-27 15:54) [12]

Удалено модератором


 
Jeer ©   (2015-01-27 16:00) [13]

Удалено модератором


 
DSKalugin ©   (2015-02-10 17:14) [14]

1)Набрать данные в массив (Для быстрого чтения отключайте гриды и куча других методов).
2)Скопировать его в выделенную область Range

var ExcelApp, Workbook, WorkSheet: OLEVariant;

Procedure InitializeExcel;
begin
 ExcelApp := CreateOleObject("Excel.Application");
 ExcelApp.Visible := False;
 ExcelApp.Application.EnableEvents := false;
end;

Procedure AddNewWorkSheet;
begin
 ExcelApp.SheetsInNewWorkbook := 1;
 Workbook := ExcelApp.WorkBooks.Add;
 WorkSheet := Workbook.Worksheets[1];
 WorkSheet.Activate;
end;

Procedure FinalizeExcel;
begin
 WorkSheet:=Unassigned;
 WorkBook:=Unassigned;
 ExcelApp:=Unassigned;
end;

Procedure fastExportToExcel(DataSet:TDataSet);
const MAX_EXCEL_ROWS=65530; // не актуально уже
var
 C, R, fc, rc : integer;
 fm, cell1, cell2, range: variant;
begin
 try
   InitializeExcel;
   AddNewWorkSheet;
   DataSet.DisableControls;
   //if DataSet is T
   rc:=DataSet.RecordCount;
   if rc>MAX_EXCEL_ROWS then rc:=MAX_EXCEL_ROWS;
   fc:=DataSet.FieldCount;
   fm:=VarArrayCreate([1,rc+1, 1,fc], varVariant);
   for c:=0 to fc-1 do begin
     fm[1, c + 1]:=DataSet.Fields[c].FieldName;

   end;
   r:=1;
   DataSet.First;
   while not DataSet.EOF do begin
     inc(r);
     for c:=0 to fc-1 do
       if DataSet.Fields[c].IsNull then fm[r, c + 1]:=""
       else fm[r, c + 1]:=DataSet.Fields[c].AsString;
     if r>MAX_EXCEL_ROWS then Break;
     DataSet.Next;
   end;
   WorkSheet.Name:=DataSet.Name;
   cell1:=WorkSheet.Cells[1, 1];
   cell2:=WorkSheet.Cells[rc+1, fc];
   range:=WorkSheet.Range[cell1, cell2];
   range.NumberFormat:="@";
   range.Value:=fm;
   for c:=1 to fc do WorkSheet.Columns[c].AutoFit;
   cell1:=WorkSheet.Cells[1, 1];
   cell2:=WorkSheet.Cells[1, fc];
   range:=WorkSheet.Range[cell1, cell2];
   range.Font.Bold:=True;
   

 finally
   VarClear(fm);
   DataSet.EnableControls;
   ExcelApp.Visible := True;
   cell1:=unassigned;
   cell2:=unassigned;
   range:=unassigned;
   FinalizeExcel;
 end;
end;



Страницы: 1 вся ветка

Текущий архив: 2015.09.27;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.005 c
15-1423517417
Юрий
2015-02-10 00:30
2015.09.27
С днем рождения ! 10 февраля 2015 вторник


2-1399631848
brother
2014-05-09 14:37
2015.09.27
TFileStream


15-1423303455
Kerk
2015-02-07 13:04
2015.09.27
О ТЗ


2-1398789485
FIL-23
2014-04-29 20:38
2015.09.27
FMX Treeviwe потомки и доступ к ним


15-1423431005
Юрий
2015-02-09 00:30
2015.09.27
С днем рождения ! 9 февраля 2015 понедельник