从数据库中查出的上千条数据显示在DBGrid中,要将这些数据导入到Excel中,如何快速批量导入?
我这样导入 ,但是速度太慢了,数据少还好点,数据稍微多点这样导肯定不行
procedure TForm1.Button1Click(Sender: TObject);
var
i,row,column:integer;
begin
Try
ExcelApplication1.Connect;
Except
MessageDlg('Excel 没有安装!请先安装 Microsoft Excel !',mtError, [mbOk], 0);
Abort;
End;
with ADOQuery1 do begin
close;
ExcelApplication1.Visible[0]:=True;
ExcelApplication1.Caption:='Excel Application';
ExcelApplication1.Workbooks.Add(Null,0); //添加新工作簿
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks[1]);
ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets[1] as _Worksheet);
try
Open;
except
showmessage('111');
exit;
end;
row:=1; While Not Eof do begin
column:=1;
for i:=1 to ADOQuery1.FieldCount do begin //逐行写入,速度较慢
ExcelWorksheet1.Cells.Item[row,column]:=ADOQuery1.fields[i-1].AsString;
column:=column+1;
end;
ADOQuery1.Next;
row:=row+1;
end;
end;
end;怎么才能实现批量导入而不是逐行导入 ?
我这样导入 ,但是速度太慢了,数据少还好点,数据稍微多点这样导肯定不行
procedure TForm1.Button1Click(Sender: TObject);
var
i,row,column:integer;
begin
Try
ExcelApplication1.Connect;
Except
MessageDlg('Excel 没有安装!请先安装 Microsoft Excel !',mtError, [mbOk], 0);
Abort;
End;
with ADOQuery1 do begin
close;
ExcelApplication1.Visible[0]:=True;
ExcelApplication1.Caption:='Excel Application';
ExcelApplication1.Workbooks.Add(Null,0); //添加新工作簿
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks[1]);
ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets[1] as _Worksheet);
try
Open;
except
showmessage('111');
exit;
end;
row:=1; While Not Eof do begin
column:=1;
for i:=1 to ADOQuery1.FieldCount do begin //逐行写入,速度较慢
ExcelWorksheet1.Cells.Item[row,column]:=ADOQuery1.fields[i-1].AsString;
column:=column+1;
end;
ADOQuery1.Next;
row:=row+1;
end;
end;
end;怎么才能实现批量导入而不是逐行导入 ?
解决方案 »
- DBGridEh问题
- getprotobynumber函数请教
- 文件的单一接口原则
- 在delphi 7下面有一个例子ResXplor,我打开一个exe文件,点击图标类,出现该图标的Offset(偏移量),请问是不是图标的地址呢?如果不是,请问如
- 肥猫安装制作问题
- 有表TABEL,其中有一个字符型字段A,字符B字段,用SQL把A最长的一条记录找出来?
- 我的DELPHI+ADO连数据库,在插入数据修改保存时,提示“缺少更新或刷新键列信息”怎样解决!
- 关于线程中 sleep的作用及其时间?欢迎近来讨论
- 菜鸟要学adodataset 问一些小问题!
- 高分求购Delphi的MSMQ例程。或者能提供这方面的资料线索(要中文的)
- CoolTrayIcon:如何彻底隐藏任务栏图标?
- webbrowser 中打开指定图片的问题
所有导入Excel的工作能不能都用过程或者函数来实现 ?
http://www.2ccc.com/article.asp?articleid=2528
http://www.2ccc.com/article.asp?articleid=2156
procedure ExGridToFile(tmpGrid : TcxGrid);
var
tmpFilePath : string;
SaveDialog: TSaveDialog;
begin
SaveDialog := TSaveDialog.Create(nil);
SaveDialog.Title := '导出数据';
SaveDialog.Filter := 'Excel 文件(*.xls)|*.xls';
SaveDialog.Options := [ofHideReadOnly,ofEnableSizing,ofOverwritePrompt];
savedialog.FilterIndex := index; try
if SaveDialog.Execute = true then
begin
tmpFilePath := saveDialog.FileName ; //取文件名
//导出为excel文件
ExportGrid4ToEXCEL(tmpFilePath,tmpGrid,True,True,false);
showdlg(0,'数据导出完成');
end;
finally
SaveDialog.Free;
saveDialog := nil;
end;
end;用法:ExGridToFile(cxGrid1);
那你就用xlReport组件来做,速度还较快的,不过xlReport的做法原理和自己用代码写的原理是一样的.
你可以试一试.这个组件网上有大把下载的.
数据集.disablecontrol完成后再enable数据集,这样试试.
如果不这样你指针动一下就会对页面refresh一下,会大大的影响导出效率的.
我不想用其他的控件,就用delphi自带的基本控件能不能实现啊 ?
var
ExpClass:TDBGridEhExportClass;
Ext:String;
begin
SaveDialog1.FileName := formatdatetime('yyyymmddhhmmss',now()); if SaveDialog1.Execute then
begin
case SaveDialog1.FilterIndex of
1: begin ExpClass := TDBGridEhExportAsText;
Ext := 'txt'; end;
2: begin ExpClass := TDBGridEhExportAsCSV;
Ext := 'csv'; end;
3: begin ExpClass := TDBGridEhExportAsXLS;
Ext := 'xls'; end;
else
ExpClass := nil; Ext := '';
end;
if ExpClass <> nil then
begin
if UpperCase(Copy(SaveDialog1.FileName,Length(SaveDialog1.FileName)-2,3))<>UpperCase(Ext) then
begin
SaveDialog1.FileName :=SaveDialog1.FileName + '.' + Ext;
end;
DBGridEh1.Selection.SelectAll;
SaveDBGridEhToExportFile(ExpClass,DBGridEh1,SaveDialog1.FileName,False);
end;
end;
end;
ExcelApp, ExcelData: Variant; ExcelData := VarArrayCreate([1, iRowCount, 1, FColumnInfoList.Count], varVariant);
ExcelData := ExcelApp.WorkSheets[1].Range[ExcelApp.WorkSheets[1].Cells[iFirstDataRow, 1], ExcelApp.WorkSheets[1].Cells[iFirstDataRow + iRowCount - 1, FColumnInfoList.Count]].Value;然后就是用两个for循环来赋值了(由于数据已经在内存了,速度会很快的):
if Trim(ExcelData[i, j]) <> '' then ANode.Values[j - 1] := Trim(ExcelData[i, j]);