从数据库中查出的上千条数据显示在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;怎么才能实现批量导入而不是逐行导入 ?

解决方案 »

  1.   

    去www.2ccc.com上找EXLReport控件,需要先设计Excel模版,导出速度绝对非常快,1W条10几个字段的数据只需要几秒中就可以完成!
      

  2.   

    http://www.freedownloadscenter.com/Programming/Delphi_Tools_and_Components/EMS_Excel_Report.html
      

  3.   

    可是如果我不想用其他控件呢 ?
    所有导入Excel的工作能不能都用过程或者函数来实现 ?
      

  4.   

    http://www.2ccc.com/article.asp?articleid=2560
    http://www.2ccc.com/article.asp?articleid=2528
    http://www.2ccc.com/article.asp?articleid=2156
      

  5.   

    //从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);
      

  6.   

    我估计是你的代码有问题.
    那你就用xlReport组件来做,速度还较快的,不过xlReport的做法原理和自己用代码写的原理是一样的.
    你可以试一试.这个组件网上有大把下载的.
      

  7.   

    你的数据源有没有和别的组件进行绑定,如果有,数据往下走之前请
    数据集.disablecontrol完成后再enable数据集,这样试试.
    如果不这样你指针动一下就会对页面refresh一下,会大大的影响导出效率的.
      

  8.   

    没有满意的答案啊……
    我不想用其他的控件,就用delphi自带的基本控件能不能实现啊 ?
      

  9.   

    用这个控件:DBGridEhprocedure 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;
      

  10.   

    提升Excel处理速度的关键是减少读写的次数,LZ可以这样做试试:首先把数据全部写进一个Variant数组里,然后把整个Variant数组当成一个Variant写进Excel中(对应Excel中的Range)。这种做法关键要理解的是Excel中很多对象都是变体类型。我以前做过的是从Excel读数据的(写的没做,原理应该一样),读取速度明显比用一格格读的提升很多。
      

  11.   

    从以前写的程序中抽了最主要的几句供参考: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]);