var
ExcelApp: Variant;
begin
    try
        ExcelApp := CreateOleObject( 'Excel.Application' );
        ExcelApp.Visible := false;
        ExcelApp.Caption := 'WEB调用 Microsoft Excel';
        ExcelApp.WorkBooks.Add;
        ExcelApp.WorkSheets[1].Activate;
        ExcelApp.Cells[1,1].Value := '第一行第一列';
        ExcelApp.Cells[1,2].Value := '第一行第二列';
        ExcelApp.SaveAs( 'C:\data\example.cvs' );
        ExcelApp.WorkBooks.Close;
        ExcelApp.Quit;
    except
    end;
程序执行时,提示Method SaveAs not supported by automation object.这个该怎么解决?还有,我程序运行的服务器上是否必须先安装EXCEL?

解决方案 »

  1.   

    1.
    代码如下,很简单,基本上是一个示范。
     var i,j : integer;begin
        adoquery1.Open;  //连接数据库,这里只演示SQL我先写进去了
        ea1 := texcelapplication.Create(self);  //excelapplication1
        ew1 := texcelworkbook.Create(self);     //excelworkbook1
        ews1 := texcelworksheet.Create(self);   //excelworksheet1
        ea1.Connect;
        ea1.Workbooks.Add(null,0);
        ew1.ConnectTo(ea1.Workbooks[1]);
        ews1.ConnectTo(ew1.Sheets[1]as _worksheet);
        if adoquery1.RecordCount > 0 then    begin
            i:= 0;
            while not adoquery1.Eof
            do        begin
                for j:=0 to adoquery1.FieldCount-1
                do
                begin
                ews1.Cells.Item[i+1,j+1]:= adoquery1.Fields[j].AsString;
                end;
            i:= i+1;
            adoquery1.Next;
            end;
        end;
           ew1.SaveCopyAs('e:\temp.xls');//保存EXCEL这里你也可以自己写更多
           //最后注意这里要把excelapplication,excelworkbook,excelworksheet
           //关闭掉,怎么关?这个自己摸摸吧。不写的话要看到EXCEL表最好把机器注销一下
    //这里只是一个示例你还可以在里面加入写表头的代码等其他功能。    end;
    请问楼主ea1   ew1   ews1,三个变量要定义吗;
    variant??
    ---------------------------------------------
    为什么我的这里出错?
        ea1 := texcelapplication.Create(self);  //excelapplication1
        ew1 := texcelworkbook.Create(self);     //excelworkbook1
        ews1 := texcelworksheet.Create(self);   //excelworksheet1
    谢谢
    ----------------------------------------------
    TO yetti(yetti) 
    你在FORM上把3个控件放上去,不需要定义的。
      

  2.   

    2.
    这是一位高人的DBGRID导出
    你可以试用一下:
    http://www.starfarmsoft.com/exchange/ExcelCtrl.dcu函数定义为:
    procedure SaveToExcel(ReptTitle, ReptHead: string; DataSet: TADOQuery; Grid: TDBGrid; FileName: string);需要说明的是:目前功能还比较简单,只对付一些常用的规则;DataSet是DBGrid的数据源(DBGrid.DataSource.DataSet=DataSet),目前是多此一举,只是为以后方便!调用例如:
    SaveToExcel('动力厂报表','excel表格',ADOQuery1,DBGrid1,'c:\动力厂报表.xls');在tools菜单----->Environment options--->library---->library path 加入'*.dcu'文件所在路径  
    再在你的程序体里USES一下ExcelCtrl!
      

  3.   

    3.
    对excel的读写: 
    unit UMain; interface uses 
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
    Db, DBTables, StdCtrls, Grids, DBGrids,Excel97,Comctrls,OleCtnrs,ComObj; type 
    TForm1 = class(TForm) 
    DBGrid1: TDBGrid; 
    Button1: TButton; 
    Button2: TButton; 
    DataSource1: TDataSource; 
    Table1: TTable; 
    procedure Button1Click(Sender: TObject); 
    procedure Button2Click(Sender: TObject); 
    procedure FormClose(Sender: TObject; var Action: TCloseAction); 
    private 
    { Private declarations } 
    public 
    XlsApp,XlsSheet,XlsWBk : Variant; 
    { Public declarations } 
    end; var 
    Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); 
    var 
    I,J : integer; 
    begin 
    if VarIsEmpty(XlsApp) then 
    XlsApp := CreateOleObject('Excel.Application'); XLsApp.Workbooks.Add; 
    XlsSheet := XLsApp.Worksheets['Sheet1']; for I := 0 to Table1.Fields.Count - 1 do 
    begin 
    XlsSheet.Cells[3,I + 1] := dbgrid1.Columns[I].Title.Caption; 
    end; Table1.first; 
    for J := 0 to Table1.RecordCount - 1 do 
    begin 
    for I := 0 to Table1.Fields.Count - 1 do 
    begin 
    XlsSheet.Cells[J + 4,I + 1] := Table1.Fields[I].AsString; 
    end; 
    Table1.Next; 
    end; XlsApp.Visible := true; 
    end; procedure TForm1.Button2Click(Sender: TObject); 
    var 
    I,J : integer; 
    TxtFile : TextFile; 
    TmpString : String; 
    begin 
    try 
    if VarIsEmpty(XlsApp) then 
    XlsApp := CreateOleObject('Excel.Application'); 
    XlsSheet := XlsApp.workbooks.open('c:\my documents\book3.xls'); AssignFile(TxtFile,'C:\My Documents\Test.txt'); 
    Rewrite(TxtFile); 
    try 
    for I := 3 to 21 do 
    begin 
    TmpString := ''; 
    for J := 1 to 5 do 
    begin 
    TmpString := TmpString + XlsSheet.ActiveSheet.Cells[I,J].Text + '|'; 
    end; 
    Writeln(TxtFile,Tmpstring); 
    end; 
    finally 
    CloseFile(TxtFile); 
    end; 
    XlsApp.Visible := true; 
    except 
    XlsSheet.close; 
    XlsApp.Application.quit; 
    XlsApp := Unassigned; 
    XlsSheet := Unassigned; 
    end; 
    end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); 
    begin 
    if not VarIsEmpty(XlsApp) then 
    begin 
    XlsApp.DisplayAlerts := True; // 7Discard unsaved files.... 
    try 
    XlsApp.Application.Quit; 
    except 
    end; 
    end; 
    end; end.