delphi 生成execl慢的问题(100)

  • 主题发起人 主题发起人 zyh6115
  • 开始时间 开始时间
Z

zyh6115

Unregistered / Unconfirmed
GUEST, unregistred user!
通过 ExcelApp := CreateOleObject('Excel.Application'); //创建 Excel 对象 ExcelApp.WorkBooks.Add; 这种方式生成execl好慢,都要几分钟才能显示数据,不知道各位有没有好的解决办法。
 
这个时候应该不会慢啊???!!!我最近碰到的是在导出数据时,我要一条一条的写入EXCEL,一秒只能写5、6条,我要导出6000多条记录时,要10多分钟。
 
买个EXCEL读写逐渐XLSRW
 
///////// 利用剪贴板,速度很快!适合装有Excel的机器///////////////////// USES Clipbrd,ComObj; procedure TForm1.Button1Click(Sender: TObject); var str:string; i:Integer; excelapp,sheet:Variant; begin // lbl2.Caption:=DateTimeToStr(Now); str:=''; dbgrd1.DataSource.DataSet.DisableControls; for i:=0 to dbgrd1.DataSource.DataSet.FieldCount-1 do str:=str+dbgrd1.DataSource.DataSet.fields.DisplayLabel+char(9); str:=str+#13; dbgrd1.DataSource.DataSet.First; while not(dbgrd1.DataSource.DataSet.eof) do begin for i:=0 to dbgrd1.DataSource.DataSet.FieldCount-1 do str:=str+dbgrd1.DataSource.DataSet.Fields.AsString+char(9); str:=str+#13; dbgrd1.DataSource.DataSet.next; lbl1.Caption:=IntToStr(dbgrd1.DataSource.DataSet.RecNo); Application.ProcessMessages; end;//end while dbgrd1.DataSource.DataSet.EnableControls; clipboard.Clear; Clipboard.Open; Clipboard.AsText:=str; Clipboard.Close; excelapp:=createoleobject('excel.application'); excelapp.workbooks.add(1); // excelapp.workbooks.add(-4167); sheet:=excelapp.workbooks[1].worksheets[1]; sheet.name:='sheet1'; sheet.paste; Clipboard.Clear; // sheet.columns.font.Name:='宋体'; // sheet.columns.font.size:=9; // sheet.Columns.AutoFit; excelapp.visible:=true; // lbl3.Caption:=DateTimeToStr(Now); end;
 
if SaveDialog1.Execute then begin if FileExists(SaveDialog1.FileName) then if Application.MessageBox('文件已经存在,确定要覆盖吗?', '提示', MB_YESNO or MB_ICONWARNING) = IDNO then Exit; if SaveDialog1.FilterIndex = 1 then SaveDBGridEhToExportFile(TDBGridEhExportAsXLS, DBGrid_main, SaveDialog1.FileName, true); if SaveDialog1.FilterIndex = 2 then SaveDBGridEhToExportFile(TDBGridEhExportAsHTML, DBGrid_main, SaveDialog1.FileName, true); if SaveDialog1.FilterIndex = 3 then SaveDBGridEhToExportFile(TDBGridEhExportAsText, DBGrid_main, SaveDialog1.FileName, true); end;
 
if Application.MessageBox('文件已经存在,确定要覆盖吗?', '提示', MB_YESNO or MB_ICONWARNING) = IDNO then如果选 是这个后面 是否需要 先删除原来的文件?
 
de410 的办法有新意,我只是想先不显示出来,全部导出后再显示,这样应该快一点,但通过剪贴板是个好办法。
 
de410 的办法可行,但只是对一个表进行操作比较理想,生成多表就费事了,特别是特殊表格数据更是如此
 
用TMS控件里面的一个EXCEL文件操作类(TXlslFile),他是用流对EXCEL文件进行操纵,读写速度非常快。
 
用第三方的导出数据库控件,如EMS Advanced Export Component Suite或SMExport
 
procedure TForm1.Button1Click(Sender: TObject); var s:TStringList; str:string; i:Integer; begin str:=''; dbgrd1.DataSource.DataSet.DisableControls; for i:=0 to dbgrd1.DataSource.DataSet.FieldCount-1 do str:=str+dbgrd1.DataSource.DataSet.fields.DisplayLabel+char(9); str:=str+#13; dbgrd1.DataSource.DataSet.First; while not(dbgrd1.DataSource.DataSet.eof) do begin for i:=0 to dbgrd1.DataSource.DataSet.FieldCount-1 do str:=str+dbgrd1.DataSource.DataSet.Fields.AsString+char(9); str:=str+#13; dbgrd1.DataSource.DataSet.next; end; dbgrd1.DataSource.DataSet.EnableControls; s:=TStringList.Create; s.Add(str); s.SaveToFile('c:/temp.xls');//保存到c:/temp.xls s.Free; end;
 
OLE模式的缓慢是早已出名的了,可以使用ODBC连接Excel文件,当成数据库一样操作,速度非常快
 
后退
顶部