不会太慢的,因为EXCEL毕竟处理的数据不会到海量,除非用OLE,建议通过ODBC或通过ado来处理。

解决方案 »

  1.   

    把数据放到剪贴板里(列#9分隔;行#13#10分隔)
    粘贴到Excel中就ok
      

  2.   

    我的一个具体例子是:用ClientDataSet从服务器端取出数据,然后将Clientdataset里的数据导入Excel文件中,这种情况下如何加快速度,有个数据,1000条的数据量耗时30秒左右。realdigua(digua)仁兄,用ODBC或ado怎么处理
      

  3.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      I: Integer;
      S: string;
      T: string;
    begin
      ClientDataSet1.First;
      while not ClientDataSet1.Eof do begin
        S := '';
        for I := 0 to ClientDataSet1.FieldList.Count - 1 do
          S := S + #9 + ClientDataSet1.FieldByName(
            ClientDataSet1.FieldList[I]).DisplayText;
        T := T + S + #13#10;
        Delete(S, 1, 1);
        ClientDataSet1.Next;
      end;
      {将T放到剪贴板}
      {调用Excel}
      {粘贴到Excel中}
    end;
      

  4.   

    while not ClientDataSet1.Eof do begin
        S := '';while not ClientDataSet1.Eof do begin
        S := '';
        for I := 0 to ClientDataSet1.FieldList.Count - 1 do
          S := S + #9 + ClientDataSet1.FieldByName(
            ClientDataSet1.FieldList[I]).DisplayText;
        T := T + S + #13#10;
        Delete(S, 1, 1);
        ClientDataSet1.Next;
      end;
    问题就是对Clientdataset的遍历在数据量大的时候也是很耗时间的。
    有没有更好的办法呢,请zswang(伴水) 多多指教
      

  5.   

    ClientDataSet1不要关联其他的数据
    如:DBGrid
    还有你要把ClientDataSet1所有的事件都取消我就是这样做
    必要时间是要花的
    用户可以理解
      

  6.   

    我也遇到这样的问题当数据条数多时,数据导入EXCEL时较慢,我用的方法是先将记录集另存为*.DBF格式然后用EXCEL打开,再另存为EXCEL格式。
      

  7.   

    to xjyin(小軍)
      Clientdataset的数据怎样存为.DBF格式
    to zswang(伴水)
    1000条数据你大概需要多少时间
      

  8.   

    下面是存为*DBF的一段代码,其中是对QUERY,和STROEDPROC所写的:
    unit unt_Common;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DBTables, Gauges, ComObj, DB;type
      Tfom_Common = class(TForm)
        tbl_DBF: TTable;
        savdlg_Common: TSaveDialog;
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      fom_Common: Tfom_Common;
      sUserName : String;
      spCommon : TStoredProc;
      qryCommon : TQuery;
      sOfficeVerNbr : String;
      slObjectList : TStringList;
      slLevelList : TStringList;
      function TransformFun(intNum : Integer):String;
      procedure SpToDbf(spProcedure :TStoredProc;sFilter ,sDefaultExt :String);
      procedure QryToDbf(qryQuery :TQuery;sFilter ,sDefaultExt :String);
      //S
    function TransformFun(intNum : Integer):String;
    var
      m,n : Integer;
      Ascii,Ascii2 : String;
    begin
      m := intNum div 26;
      n := intNum mod 26;
      if m <> 0 then
        Ascii := TransformFun(m-1);
      Ascii2 := char(65+n);
      Result := Ascii+Ascii2;
    end;
    //E
    //S
    procedure SpToDbf(spProcedure :TStoredProc;sFilter ,sDefaultExt :String);
    begin
      with fom_Common do
      begin
        savdlg_Common.DefaultExt := sDefaultExt;
        savdlg_Common.Filter := sFilter;
        if savdlg_Common.Execute then
        begin
          tbl_DBF.TableName := savdlg_Common.FileName;
          spProcedure.First;
          tbl_DBF.BatchMove(spProcedure,batCopy);
          MessageDlg('Success!'+#13+#13+'File Path = ' + savdlg_Common.FileName,mtinformation,[mbok],0);
        end;
      end;
    end;
    //E//S
    procedure QryToDbf(qryQuery :TQuery ; sFilter ,sDefaultExt :String);
    begin
      with fom_Common do
      begin
        savdlg_Common.DefaultExt := sDefaultExt;
        savdlg_Common.Filter := sFilter;
        if savdlg_Common.Execute then
        begin
          tbl_DBF.TableName := savdlg_Common.FileName;
          qryQuery.First;
          tbl_DBF.BatchMove(qryQuery,batCopy);
          MessageDlg('Success!'+#13+#13+'File Path = ' + savdlg_Common.FileName,mtinformation,[mbok],0);
        end;
      end;
    end;
    //Eend.
      

  9.   

    zswang(伴水)的粘贴方法能行吗?我看xjyin(小軍)的方法还可以试一下。
    从速度的角度看,直接写入excel可能会比存到数据库要慢;不过从excel中打开dbf要多久时间就没有算过了
      

  10.   

    首先选择使用线程,其次就是将数据写入文本中,不过要添加适当的控制符号,比如#9,作为一个文本文件来操作,这样的话可以节省很多打开Excel控件的时间,然后将文件名设置为.Xls为扩展名的文件,这样用Excel打开的时候免去选择选择打开方式的问题。
      

  11.   

    to NightCloud():
      时间是花在打开Excel上
      如果Excel已经是打开的不过3秒
      

  12.   

    //这个循环需要多少时间?
      ClientDataSet1.First;
      while not ClientDataSet1.Eof do begin
        S := '';while not ClientDataSet1.Eof do begin
        S := '';
        for I := 0 to ClientDataSet1.FieldList.Count - 1 do
          S := S + #9 + ClientDataSet1.FieldByName(
            ClientDataSet1.FieldList[I]).DisplayText;
        T := T + S + #13#10;
        Delete(S, 1, 1);
        ClientDataSet1.Next;
      end;//以前我做的是一条条的放到Excel
      ExcelApplication....Cell[vCell] := S;
    //1000条至少要60秒//后来我看见客户用SQL Server统计后直接拷贝到Excel中
    //6000多条不过3秒中
    //我就得到了启示
      

  13.   

    当然用DBF也是一种方法
    可是BatchMove()就要用到DBE
    如果客户那里没有Setup就很惨
      

  14.   

    不好意思,打扰各位,请帮帮我
    http://www.csdn.net/expert/topic/378/378117.shtm
      

  15.   

      我想在遍历ClientdataSet数据的时候用一个线程同时Create一个Excel文件,但出现了"尚未执行CoInitialize..."的错误信息。这是什么原因?
      请zswang(伴水)兄及各位大拿指点迷津。
      另:给贴子加分,这几天老想给分,但都未成功,望各位仁兄见谅
      

  16.   

    如果是从SQL中导入的话,用sp_addlinkedserver连接EXCEL,然后用OPENROWSET或OPENQUERY打开数据集直接插入EXCEL。我用这种办法从SQL中备份数据到ACCESS,速度比较快。我感觉和用SQL备份差不多。100M的库也不过10分钟左右吧。
      

  17.   

    SQL?是 SQL Server 吗?sp_addlinkedserver也是SQL Server的东东?请zfmich()兄为我答疑