把ADOQuery中的数据导出到EXCEL中太慢,差不多平均一秒多钟导一条记录,怎么才能提高速度 ?(100分)

  • 主题发起人 主题发起人 ccweifen
  • 开始时间 开始时间
C

ccweifen

Unregistered / Unconfirmed
GUEST, unregistred user!
程序: 表字段比较多, 50多个字段 。
var
xlsapp,xlssheet:variant;
xlsfilename,xlsfiletitle,xlsfiledate:string;
i,j:integer;
Savedialog1 :TSaveDialog;
BookMark1:TBookMark ;
begin
SaveDialog1 :=TSaveDialog.create(Application);
SaveDialog1.Filter := 'Excel文件(*.xls)|*.XLS';

if savedialog1.Execute then
if savedialog1.FileName <>'' then
begin
xlsfilename := savedialog1.FileName ;
xlsfiletitle:='考勤汇总' ;
try
xlsapp:=createoleobject('excel.application');
xlssheet:=createoleobject('excel.sheet');
except
showmessage('本机没有安装Microsoft excel!');
savedialog1.Free ;
exit;
end;
Panel1.BringToFront ;
ProgressBar1.Min :=0 ;
ProgressBar1.Max :=ADOQuery.RecordCount ;
ProgressBar1.Position:=0 ;
Label7.Caption :='正在导出数据到'+xlsfilename ;
BookMark1:=ADOQuery.GetBookmark ;
ADOQuery.DisableControls ;
Application.ProcessMessages ;
Panel1.Refresh ;
Screen.Cursor :=crHourGlass ;
try
xlssheet:=xlsapp.workbooks.add;
ADOQuery.First;
// Label7.Caption :='正在'
for j := 0 to wwDBGrid1.Selected.Count-1 do
begin
xlsapp.Cells.item[1, j + 1].NumberFormatLocal :='@';
xlsapp.Cells.item[1, j + 1] := wwDBGrid1.Columns[J].DisplayLabel ;
xlsapp.Cells.item[1, j + 1].font.size := '10';
end;
for i := 2 to ADOQuery.RecordCount + 1 do
begin
for j := 0 to wwDBGrid1.Selected.Count-1 do
begin
case ADOQuery.FieldByName(wwDBGRid1.Columns[J].FieldName).DataType of
ftFloat, ftCurrency, ftBCD
: xlsapp.Cells.item[i, j + 1].NumberFormat := '0.00';
else xlsapp.Cells.item[i, j + 1].NumberFormatLocal :='@';
end;
xlsapp.Cells.item[i, j + 1] :=ADOQuery.FieldByName(wwDBGRid1.Columns[J].FieldName).AsString ;
xlsapp.Cells.item[i, j + 1].font.size := '10';
end;
ADOQuery.Next;
ProgressBar1.Position:=I-1 ;
Application.ProcessMessages ;
end;
xlsapp.Columns.AutoFit;
xlssheet.saveas(xlsfilename);
xlssheet.close;
xlsapp.quit;
xlsapp:=unassigned;
showmessage('数据已保存为: '+xlsfilename);
except
showmessage('数据转换出错!');
Panel1.SendToBack ;
xlssheet.close;
xlsapp.quit;
xlsapp:=unassigned;
end;
SaveDialog1.Free ;
Panel1.SendToBack ;
ADOQuery.EnableControls ;
ADOQuery.GotoBookmark(BookMark1) ;
ADOQuery.FreeBookmark(BookMark1) ;
end;
Screen.Cursor :=crDefault ;

我测试了导出20条记录 , 要用24秒钟,
一般汇总表记录在2500条左右,如果全导出的话估计要一个小时左右。岂不是要死人
如果去掉
case ADOQuery.FieldByName(wwDBGRid1.Columns[J].FieldName).DataType of
ftFloat, ftCurrency, ftBCD
: xlsapp.Cells.item[i, j + 1].NumberFormat := '0.00';
else xlsapp.Cells.item[i, j + 1].NumberFormatLocal :='@';
end ;
这格式化数据的代码,速度稍快点, 多一秒一条。
能不能一下子格式化EXCEL的一整列 ? 不用格式化每个单元格
 
你这样导当然慢啊,用碧雪剑的办法吧,一个字:快.
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1691966
 
给你举个例子:
xlsapp.Range['A1:C7'].NumberFormat := '0.00';
再自己琢磨一下很快就会明白,一定要注意[]里的写法与在EXCEL中的写法一样。
 
楼上的文不对题吧?是不是放错地方了?
 
http://chinasmsd.com/myweb/jxguang/download/index.htm
有个控件,试试如何?
 
谢谢小刚,
在碧血剑的文章里没有找到从SQL Server导到EXCEL的做法, 虽然他说要举一反三 ,
可能是我太笨, 举不出来 。继续请教
 
有一个修改过的EHLIb控件,
http://new.playicq.com/dispdocnew.php?id=2193
导出到execl,想要有多快就有多快。
 
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOConnection1.ConnectionString:='Provider=MSDASQL.1;Persist Security Info=False;Extended Properties="DSN=Excel Files;DBQ=MyPathFileName;DefaultDir=MyPath;DriverId=790;MaxBufferSize=2048;PageTimeout=5;"'
//MyPathFileName:填你自己的路径文件名
//MyPath: 填路径,跟文件所在要在一个路径
ADOConnection1.Connected :=true;
ADOConnection1.Execute ('SELECT * '+
'INTO SheetName FROM TableName '+
//注意:SheetName是将要得到的Excel文件中的表名
'IN [ODBC] [ODBC;Driver=SQL Server;UID=LogName;PWD=MyPWD;Server=ServerName;DataBase=MyData;]');

end;
 
我用ip3000显示数据的, 不想改用其它控件了
 
那你用什么连接数据库?
难道不是用ADO吗?你放一个TADOConnection就可以运行我上面的程序了呀
 
程序执行没错, 生成了一个EXCEL文件 ,
但无法打开这个文件 ? 提示"不能防问aaa.xls文件"
文件名为aaa.xls , sheetname名可以随意设置吗 ?

 
原来要在程序退出后才能开发这EXCEL文件 , 如果程序运行着,
就会提示"不能防问aaa.xls文件"
怎么才能不退出程序也可防问EXCEL文件呢?
 
把ADOConnection1关闭就行了 ;)
谢谢小刚兄
 
后退
顶部