实现的效果就是将dbgrideh中的数据导出到excel刚开始用creatoleobject速奇慢(记得 use comobj);
导出几个记录看不出什么,当数据有千条以上,要十多分钟!汗。优化好几次效果也不明显!
代码如下:
function TForm_Bc.export_xls(xls_name: string): string;
var
xls,sheet1:variant;
i,j:integer;
begin
j:=2;
SaveDialog1.FileName:=xls_name+'_'+FormatDatetime('YYYY-MM-DD',now);
SaveDialog1.filter:='Excel文件(*.xls)|*.xls';
if not SaveDialog1.Execute then exit;
try
xLS:=createoleobject('excel.application');
SHEET1:=createOleobject('excel.sheet');
except
showmessage('启动EXCEL失败,可能原因是由于您的机器未安装EXCEL');
exit;
end;
xls.visible:=false;
sheet1:=xls.workbooks.add;
try
for i:=0 to DBGridEh1.Columns.count-1 do
sheet1.worksheets[1].cells[1,i+1].value:=DBGridEh1.Columns[i].title.caption;
with datamodule1.Query_ML do
begin
first;
while Not eof do
begin
for i:=0 to fieldcount-1 do
begin
sheet1.worksheets[1].cells[j,i+1].value:=Fields[i].AsString;
end;
inc(J);
next;
end;
end;
except
showmessage('导出数据失败!');
end;
try
sheet1.saveas(savedialog1.filename);
sheet1.close;
xls.quit;
except
sheet1.close;
xls.quit;
end;
xls:=Unassigned; sheet1:=Unassigned;
end;
var
xls,sheet1:variant;
i,j:integer;
begin
j:=2;
SaveDialog1.FileName:=xls_name+'_'+FormatDatetime('YYYY-MM-DD',now);
SaveDialog1.filter:='Excel文件(*.xls)|*.xls';
if not SaveDialog1.Execute then exit;
try
xLS:=createoleobject('excel.application');
SHEET1:=createOleobject('excel.sheet');
except
showmessage('启动EXCEL失败,可能原因是由于您的机器未安装EXCEL');
exit;
end;
xls.visible:=false;
sheet1:=xls.workbooks.add;
try
for i:=0 to DBGridEh1.Columns.count-1 do
sheet1.worksheets[1].cells[1,i+1].value:=DBGridEh1.Columns[i].title.caption;
with datamodule1.Query_ML do
begin
first;
while Not eof do
begin
for i:=0 to fieldcount-1 do
begin
sheet1.worksheets[1].cells[j,i+1].value:=Fields[i].AsString;
end;
inc(J);
next;
end;
end;
except
showmessage('导出数据失败!');
end;
try
sheet1.saveas(savedialog1.filename);
sheet1.close;
xls.quit;
except
sheet1.close;
xls.quit;
end;
xls:=Unassigned; sheet1:=Unassigned;
end;
这种方法的好处是可以对EXCEL的每个单元格进行操作,但是数据量大的时候太慢。分析了许久可能的原因是由于这种方法需要启动EXCEL并对每个单元格操作,所以才这样!