读书人

数据库中的数据怎么批量导入Excel

发布时间: 2012-03-02 14:40:28 作者: rapoo

数据库中的数据如何批量导入Excel ?
从数据库中查出的上千条数据显示在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;

怎么才能实现批量导入而不是逐行导入 ?

[解决办法]
去www.2ccc.com上找EXLReport控件,需要先设计Excel模版,导出速度绝对非常快,1W条10几个字段的数据只需要几秒中就可以完成!
[解决办法]
http://www.freedownloadscenter.com/Programming/Delphi_Tools_and_Components/EMS_Excel_Report.html
[解决办法]
http://www.2ccc.com/article.asp?articleid=2560
http://www.2ccc.com/article.asp?articleid=2528
http://www.2ccc.com/article.asp?articleid=2156
[解决办法]
//从CXGrid导出数据到文件Excel
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);
[解决办法]
你的数据源有没有和别的组件进行绑定,如果有,数据往下走之前请
数据集.disablecontrol

完成后再enable数据集,这样试试.
如果不这样你指针动一下就会对页面refresh一下,会大大的影响导出效率的.
[解决办法]
up
[解决办法]
用这个控件:DBGridEh

procedure TFrmMain.RzBitBtn28Click(Sender: TObject);
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;
[解决办法]
提升Excel处理速度的关键是减少读写的次数,LZ可以这样做试试:

首先把数据全部写进一个Variant数组里,然后把整个Variant数组当成一个Variant写进Excel中(对应Excel中的Range)。

这种做法关键要理解的是Excel中很多对象都是变体类型。我以前做过的是从Excel读数据的(写的没做,原理应该一样),读取速度明显比用一格格读的提升很多。
[解决办法]
从以前写的程序中抽了最主要的几句供参考:

var
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]);

读书人网 >.NET

热点推荐