在线紧急求助:
 在Delphi中如何把查询到的数据存储为一个文件(主要是Excel文件)???
请各位大侠帮帮忙,我忙了几天了,头都大了!  先谢谢大家了!

解决方案 »

  1.   

    examaple:
    use master
    go
    xp_cmdshell 'bcp "SELECT au_fname, au_lname FROM pubs..authors ORDER BY au_lname" queryout c:\stu.xls -c  -Usa -P',NO_OUTPUTalso, you can make that sql script as a store procedured.================================================================
         ◆◆◆ CSDN查询助手,查询方便快捷◆◆◆ 下载地址:  
     http://CoolSlob.ifood1.com/Download/CSDNFinder.exe  
     http://CoolSlob.8u8.com/Download/Tools/CSDNFinder.Slob[更名为.exe即可]  
      

  2.   

    可以用ADO来控制Excel文件,把Excel文件当做一个数据库,每个Sheet是一个表,Sheet的第一行如果有文字的话,每一列的列名就是第一行中的文字。
      

  3.   

    请教:  回复人: CoolSlob() 
       我用的数据库是Delphi自带的Paradox的数据库,都是 .db文件,它的SQL语法功能很弱,我刚才试了上面的代码,有点问题,请问在这样的数据库下如何处理?
      

  4.   

    请教   回复人: ibbcall()  请问具体怎么处理?我对ADO不熟悉,能否请您提供一个例子,先谢谢了!
      

  5.   

    用类似如下方法
     ExcelWorksheet1.Cells.Item[1,1]:=Edit1.Text;
    往Excel中用循环写入
      

  6.   

    最好是自己写一个保存数据的控件。数据的流向是:数据库->界面->保存数据
    在程序里,你已经把数据显示在界面上。如果你的数据从数据库查询出来的时候是保存在对象里。那么,你可以用一个控件把保存数据的对象里的所有数据保存到Excel中。我以前写过把界面数据保存到Excel和Word的函数。但是不知道是否还可以找到。或许对你有用!
      

  7.   

    begin
      const
      adClipString = 2;
      ColumnDelimeter = ';';
      RowDelimeter = #13#10;
    var
      s: string;
      fs: TFileStream;
    begin
      adoquery1.open;
      s := adoquery1.Recordset.GetString(adClipString, adoquery1.RecordCount,ColumnDelimeter,RowDelimeter ,'');
      // export to a txt file
      fs := TFileStream.Create('c:\Temp.CSV', fmCreate);
      try
        fs.WriteBuffer(s[1], Length(s));
      finally
        fs.Free;
      end;
      ShowMessage('Temp.CSV has been saved');
    end;
    end;//.csv文件可以被EXCEL识别并打开
      

  8.   

    给你一个已经写好能用的 函数:已经测试通过。
    procedure ExportToExcel(DataSet: TDataSet);
    var
      myexcel: Variant;
      workbook: olevariant;
      worksheet: olevariant;
      i, j, n: Integer;
    begin
      try
        myexcel:=createoleobject('excel.application');
        myexcel.application.workbooks.add;
        myexcel.caption:='例子';
        myexcel.application.visible:=true;
        workbook:=myexcel.application.workbooks[1];
        worksheet:=workbook.worksheets.item[1];
      except
        showmessage('excel???');
      end;
      i:=1;
      j:=1;  if not DataSet.Active then Exit;  DataSet.first;
      for n:=0 to DataSet.fieldcount-1 do
      begin
        worksheet.cells(i, j):=DataSet.fields[n].displaylabel;
        j:=j+1;
      end;
      DataSet.first;
      while not DataSet.eof do
      begin
        inc(i);
        for j:=0 to DataSet.fieldcount-1 do
          worksheet.cells[i, j+1]:=DataSet.fields[j].asstring;
        DataSet.Next;
      end;end;
      

  9.   

    这个也可以用
    Unit excel;   interface   uses   Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,ComObj;   //ComObj是操作OLE对象的函数集   type TForm1 =class(TForm)   Button1: TButton;   procedure Button1Click(Sender: TObject);   private   { Private declarations }   public   { Public declarations }   end;   var   Form1: TForm1;   implementation   {$R *.DFM}   procedure TForm1.Button1Click(Sender: TObject);   var   eclApp,WorkBook:Variant;   //声明为OLE Automation 对象   xlsFileName:string;begin   xlsFileName:='ex.xls';   try   //创建OLE对象Excel Application与 WorkBook   eclApp:=CreateOleObject('Excel.Application');   WorkBook:=CreateOleobject('Excel.Sheet');   except   ShowMessage('您的机器里未安装Microsoft Excel。');   Exit;   end;   try   ShowMessage('下面演示:新建一个XLS文件,并写入数据,最后关闭它。');   workBook:=eclApp.workBooks.Add;   eclApp.Cells(1 , 1):='字符型';   eclApp.Cells(2 , 1):='Excel文件';   eclApp.Cells(1 , 2):='Money型';   eclApp.Cells(2 , 2):=10.01;   eclApp.Cells(1 , 3):='日期型';eclApp.Cells(2 , 3):=Date;   WorkBook.saveas(xlsFileName);   WorkBook.close;   ShowMessage('下面演示:打开刚创建的XLS文件,并修改其中的内容,然后,由用户决定是否保存。');   WorkBook:=eclApp.workBooks.Open(xlsFileName);   eclApp.Cells(2 , 1):='Excel文件类型';   if MessageDlg(xlsFileName+'文件已被修改,是否保存?',mtConfirmation, [mbYes, mbNo], 0) = mrYes then   WorkBook.save   else   workBook.Saved := True; //放弃修改   WorkBook.Close;
      

  10.   

    asheet.application1.quit;
      或者
       asheet.quit;
    此代码执行时,请问出现这样的错误是什么原因造成的?
      application1
      或者
      quit 不能在 automaiton 情况下执行   我试验了好几次,把属性也调整了好几次,可还是出现这样的情况
       使得我的EXCEL生成后,如果想在相应的目录下打开,就打不开请问是什么地方要调整? 先谢谢各位大虾的帮忙;)!
      

  11.   

    大家帮帮忙啊:asheet.application1.quit;
      或者
       asheet.quit;
    此代码执行时,请问出现这样的错误是什么原因造成的?
      application1
      或者
      quit 不能在 automaiton 情况下执行   我试验了好几次,把属性也调整了好几次,可还是出现这样的情况
       使得我的EXCEL生成后,如果想在相应的目录下打开,就打不开请问是什么地方要调整? 先谢谢各位大虾的帮忙;)!
      

  12.   

    //10进制转换为26进制,目前只支持[0,26*26-1]范围
    function  DecTo26(Value:integer):string;
    const STR_A='A';
    var m,n:integer;
        s:string;
    begin
      Result := '';
      if (Value>=26*26) or (Value<0) then Exit;
      s:='';
      m := Value mod 26;
      n := Value div 26;
      if n>0 then s :=Chr(Ord('A')+n-1);
      s := s+ Chr(Ord('A')+m);
      Result := s;
    end;
    procedure SaveAsExcel(FileName:string);
    var
        ExcelApp,WorkBook: Variant;
        i,j,k:integer;   //i列No,j行No,k可见列
        s:string;
        SavePlace: TBook;
        Range :Variant;
        CurRecCount:integer;
    begin
        try
           ExcelApp := CreateOleObject( 'Excel.Application' );
           WorkBook := CreateOleObject('Excel.Sheet');
         Except
           Exception.Create('对不起,您的机器上没有安装Microsoft Excel,该文件不能生成!');
           Exit;
         End; //try...Except     if FileExists(FileName) then
           DeleteFile(FileName);     SavePlace:=nil;
         try
           SavePlace := Query.GetBook;
           Query.DisableControls;
           Query.First;
           try
               ExcelApp.Visible := false;
               ExcelApp.Caption := '查询导出文件';
               WorkBook := ExcelApp.WorkBooks.Add;           ExcelApp.ActiveSheet.Name := PrintTitle;
               //导出标题...
               k:=0;
               for i := 0 to DBGrid.Columns.Count-1  do
               begin
                   if not DBGrid.Columns[i].Visible then Continue;
                   ExcelApp.Cells(1,k+1)  := DBGrid.Columns[i].Field.DisplayLabel;
                   if DBGrid.Columns[i].Field.DataType = ftString  then
                   begin
                     ExcelApp.ActiveSheet.Columns[k+1].numberformatlocal:= '@';
                     if Assigned(DBGrid.Columns[i].Field.OnGetText) then
                         ExcelApp.ActiveSheet.Columns[k+1].ColumnWidth := 20  //需要代码转名称字段默认长度20
                     else
                         ExcelApp.ActiveSheet.Columns[k+1].ColumnWidth := DBGrid.Columns[i].Field.Size;
                     if Cardinal(DBGrid.Columns[i].Field.Size)<strlen(pchar(DBGrid.Columns[i].Field.DisplayLabel)) then
                         ExcelApp.ActiveSheet.Columns[k+1].ColumnWidth := strlen(pchar(DBGrid.Columns[i].Field.DisplayLabel));
                   end;
                   k:=k+1;
               end;           //导出每行数据...
               j:=2;
               while not Query.Eof do
               begin
                   k:=0;
                   for i:=0 to DBGrid.Columns.Count-1  do
                   begin
                       if not DBGrid.Columns[i].Visible then Continue;
                       s := DBGrid.Columns[i].Field.DisplayText;
                       ExcelApp.Cells(j,k+1) := s;
                       k:=k+1;
                   end;//i
                   j:=j+1;
                   Query.Next;           end;           //标题栏字体,背景色
               ExcelApp.ActiveSheet.Rows[1].Font.Name   := '宋体';
               ExcelApp.ActiveSheet.Rows[1].Font.Color  := clBlack;
               Range := ExcelApp.ActiveSheet.Range['A'+'1'+':'+DecTo26(k-1)+'1'];
               Range.interior.Color := clSilver;
               //自动加外边框
               Range := ExcelApp.ActiveSheet.Range['A'+'1'+':'+DecTo26(k-1)+inttostr(j-1)];
               Range.Borders.LineStyle := 1;
               Range.WrapText:=True;
               Range.VerticalAlignMent:= 1;
               Range.HorizontalAlignment:=1;           //保存文件
               WorkBook.Saveas(FileName);
           except
             Application.MessageBox(PChar('生成Excel文件【'+FileName+'】出错!'),'提示',MB_OK+MB_ICONINFORMATION);
           end;
         finally
           Query.EnableControls;
           Query.GotoBook(SavePlace);
           Query.FreeBook(SavePlace);
           WorkBook.Close;
           ExcelApp.Quit;
         end;
    end;
      

  13.   

    gototop99(巴蒂)
    请问你的ExportToExcel(DataSet: TDataSet)程序,为什么我在调用时,会出现不兼容OLE类的错误。错误信息如下:Project sss.exe raised exception class Eoleexcepton message 'OLE error 800A03EC'.Proecss stoped.出现错误行为:
    worksheet.cells[i, j+1]:=DataSet.fields[j].asstring;
    谢谢
      

  14.   

    马上结帖子了。
      上面 to redfox01(小红帽)  的问题谁帮他/她再解决一下。
      

  15.   

    procedure TForm18.SpeedButton10Click(Sender: TObject);
    var
    Temp_Worksheet: _WorkSheet;
    i,j:integer;
    begin
    //关闭Excel.
    Try
    ExcelApplication1.Quit;
    ExcelWorksheet1.Disconnect;
    ExcelWorkbook1.Disconnect;
    ExcelApplication1.Disconnect;
    Except
    End;
    Try //打开Excel。
    ExcelApplication1.Connect;
    Except
    End;
    ExcelApplication1.Visible[0]:=True;
    ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.Add(EmptyParam,0));
    Try //添加一个Worksheet。
    Temp_Worksheet:=ExcelWorkbook1.
    WorkSheets.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam,0)as _WorkSheet;//(注意)
    ExcelWorkSheet1.ConnectTo(Temp_WorkSheet);
    Except
    exit;
    End;
    for i:=0 to dbgrid1.FieldCount-1 do//将表头导入EXCEL
    begin
    ExcelWorksheet1.Cells.item[1,i+1]:=dbgrid1.Columns.items[i].Title.Caption;
    end;
    //导入数据库中的数据至EXCEL
    i:=2;
    dbgrid1.DataSource.DataSet.First;
    dbgrid1.DataSource.DataSet.DisableControls;
    while not dbgrid1.DataSource.DataSet.Eof do
    begin
    for j:=0 to dbgrid1.FieldCount-1 do
    begin
    if dbgrid1.Fields[j]<>nil then
    ExcelWorksheet1.Cells.item[i,j+1]:=trim(dbgrid1.Fields[j].asstring)
    else
    ExcelWorksheet1.Cells.item[i,j+1]:='';
    end;
    i:=i+1;
    dbgrid1.DataSource.DataSet.Next;
    end;
    dbgrid1.DataSource.DataSet.EnableControls; 
    end;
      

  16.   

    try
          WorkBook.SaveAs(filePath);
          WorkBook.Close;
        except
          WorkBook.Close;
        end;
        ExcelApp.Quit;
        ExcelApp := Unassigned;