首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

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

2012-03-02 
数据库中的数据如何批量导入Excel ?从数据库中查出的上千条数据显示在DBGrid中,要将这些数据导入到Excel中

数据库中的数据如何批量导入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]);

热点排行