Форум: "Прочее";
Текущий архив: 2015.09.27;
Скачать: [xml.tar.bz2];
ВнизУскорить экспорт в 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.002 c