用ADOQuery连接SQL Server得到的数据导出到Excel表中,用的是一行一行的导出,但是数据量很大,效率低CPU使用率很高。想请教怎样一次性的导出?是不是可以先复制到粘贴板,再粘贴到Excel表。
另外还有一个问题,Delphi怎样设置Excel整列都居中或左对齐?

解决方案 »

  1.   


    http://blog.csdn.net/Dreamnest/archive/2005/08/24/463490.aspx
      

  2.   

    xls.range('a').copyrecord  rs
    大概这个写法,copyrecordset
      

  3.   

    copyfromrecordset
    range('a').align=.....
    我一般都是在EXCEL里面建立宏,然后在看宏代码
      

  4.   

    [Fatal Error] DBGridEhToExcel.pas(6): File not found: 'DBGridEh.dcu'这个是第3方控件单元么????
      

  5.   

    用这个最快-----uTDS2Excel.pas调用如下:
      ADOQuery3.Close;
      ADOQuery3.Open;
      if ADOQuery3.RecordCount > 0 then
      begin
        with TDS2Excel.Create(TDataSet(ADOQuery3)) do
        try
          Save2File('c:\产品.xls', True);
        finally
          Free;
        end;
        ShowMessage('产品已经导出到C盘');
      end;
    end;
      

  6.   

    用这个最快-----uTDS2Excel.pas这个是安装什么第3方控件才有的啊????请问。
      

  7.   

    如果要带格式,用OLE来导出的话速度不可能很快的。不要格式则可以利用Excel内置的数据集功能快一些,关键代码:
    var
      Sheet, xlQuery: OleVariant;
    begin  
      ...
      xlQuery := Sheet.QueryTables.Add(ADOQuery1.Recordset, Sheet.Range['A3']);
      //xlQuery.FieldNames := false;
      xlQuery.Refresh;
      ...
    end;当然速度最快的应该是直接写文件,只是MS没有公开Excel文件格式,估计也不会公开的:)
      

  8.   

    谢谢各位了!
    但是能不能COPY到粘贴板呢?
    用SQL查询分析器查询的时候,我们可以直接对查询结果进行复制的。
    那是不是也可以直接从DBGrid复制,怎么用程序实现?还有第二个问题怎么都没人帮忙解答?
      

  9.   

    上午我也想尝试使用”剪贴板来完成“,但是导出来的中文字却变成乱码了,我晕!uses Clipbrd;function TForm1.ToExcel: boolean;
    var
      y:integer;
      tslist:TstringList;
      s:string;
      aSheet:variant;
    begin
      result:=true;  ExcelApplication1.Connect;
      ExcelApplication1.Visible[0]:=true;
      ExcelApplication1.Workbooks.Add(xlWBATWorksheet,0);
      aSheet:=ExcelApplication1.Worksheets.Item[1];  tslist:=TStringlist.Create;  with adoquery1 do
       begin
          open;
          first;
          while not Eof do
            begin
               s:='';
               for y:=0 to fieldcount-1 do
                 begin
                   s:=s+fields[y].AsString+char(9);
                   application.ProcessMessages;
                 end;
               tslist.Add(s);
               next;
            end;
          close;
       end;   Clipboard.AsText:=tslist.Text;   tslist.Free;   ExcelApplication1.Disconnect;
       aSheet.paste;
       result:=true;end;为了实验就没用try  finally结构呵呵。
    导出来数据结果是:
    ==========================================================
    30308 ???è ·?????ê??± 30308 public
    31389 ?£á? ·?????ê??± 31389 public
    31677 ??áá ·???1¤3ìê| 31677 public
    31834 ?×ì??? ·????÷1ü 31834 master
    31835 ?×?·oì 2ù×÷1¤ 31835 public
    31908 ??è? 2ù×÷1¤ 31908 public
    31914 ?ì′oà× ·???1¤3ìê| 31914 public
    31948 óà??D? ·???1¤3ìê| 31948 public
    31955 ?a?÷ó¢ 2ù×÷1¤ 31955 public
    32016 í????? áì°à 32016 public
    32080 3??? ??DT?÷1ü 32080 master
    32103 ·??2?? ·?????ê??± 32103 public
    ======================================================================
    SQL数据库中正常的数据是:
    30308 倪娜 分析技术员 30308 public NULL
    31389 郑峥 分析技术员 31389 public NULL
    31677 付亮 分析工程师 31677 public NULL
    31834 孔条香 分析主管          31834  master NULL
    31835 孔梅红 操作工 31835 public NULL
    31908 孙蓉 操作工 31908 public NULL
    31914 朱春雷 分析工程师 31914 public NULL
    31948 余乾新 分析工程师 31948 public NULL
    31955 吴明英 操作工 31955 public NULL
    32016 汪文女 领班 32016 public NULL
    32080 陈强 维修主管 32080 master NULL
    不知道如何处理?请高手指教啊!
      

  10.   

    可能考虑先用上面我提的利用Excel内置的数据集功能导出数据(试了一下,导出2000多条记录,有三个字段,导出共用了1.5秒左右),然后再用OLE连上导出的文件设置格式
      

  11.   

    /*******  导出到excel
    EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q -S"GNETDATA/GNETDATA" -U"sa" -P""'/***********  导入Excel
    SELECT * 
    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
      'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions