下面是我的原码,当运行时错误提示
cell不支持动态对象,何解?高手指点!!!
procedure Tkfb_query.Button15Click(Sender: TObject);
var
 range: Variant;
 varexcel: Variant;
 i,j,k :integer;
 xxx1,xr:string;
begin
    if(ListBox2.Items.Count=0) then
      begin
        Showmessage('没有选择目标字段!');
       exit;
        end;
    if DM.kfb_hetongchaxun.Active =true then
     begin
      if DM.kfb_hetongchaxun.RecordCount >0 then
         begin
          Screen.Cursor:=crSqlWait;
         kfb_query.StatusBar1.panels[0].text :='正在载入Excel,请稍候......';
         kfb_query.StatusBar1.refresh;
         try
            Screen.cursor :=crHourGlass;
             try
               varexcel := createoleobject('excel.application');
                if not varisempty(varexcel) then
                 begin
              //添加工作簿
                 varexcel.Workbooks.add;
                 varexcel.Workbooks[1].worksheets[1].name :='合同信息';
                  end;
               except
                Showmessage('请确认是否安装Excel');
                exit;
                end;
           begin
            //写入标题
              range :=varexcel.workbooks[1].worksheets[1].columns;
              for i:=0 to kfb_query.ListBox2.items.count -1 do
                 begin
              varexcel.workbooks[1].worksheets[1].cell[2,i+1].value := kfb_query.ListBox2.items.strings[i];//              varexcel.workbooks[1].worksheets[1].cell[2,i+1] :=Trim(kfb_query.ListBox2.items[i]);              varexcel.workbooks[1].worksheets[1].cell[2,i+1].Font.bold :=true;
//              range.columns[i+1].columnwidth := DM.kfb_hetongchaxun.FieldByName(Trim(kfb_query.ListBox2.items[i])).Displaywidth;
              range.columns[i+1].columnwidth := DM.kfb_hetongchaxun.FieldByName(kfb_query.ListBox2.items.strings[i]).Displaywidth;
              range.columns[i+1].HorizontalAlignment :=xlCenter;
               end;
           ///////////////
           //循环写入数据
           try
              DM.kfb_hetongchaxun.first;
                j :=3;
                while not DM.kfb_hetongchaxun.eof do
                  begin
                      for i:=1 to DM.kfb_hetongchaxun.RecordCount  do
                      begin
                      if varisnull(Trim(DM.kfb_hetongchaxun.FieldValues[Trim(kfb_query.ListBox2.items.strings[i])])) then
                        varexcel.workbooks[1].worksheets[1].cell[j,i+1].value :=''
                       else
                       varexcel.workbooks[1].worksheets[1].cell[j,i+1].value := Trim(DM.kfb_hetongchaxun.FieldValues[Trim(kfb_query.ListBox2.items.strings[i])]);
                       end;
                       DM.kfb_hetongchaxun.next;
                      j:=j+1;
                    end;
            except
        MessageDlg('导出Excel错误!',mtError,[mbOk],0);
        Screen.Cursor:=CrDefault;
        exit;
        end;
//        DM.kfb_hetongchaxun.e;
        kfb_query.statusbar1.panels[0].text:='';
          k:=i-1+ord('A');
          xxx1 :=chr(k);
          xxx1 :='A2:'+xxx1+inttostr(j-1);
          //将数据表格画线
          range := varexcel.workbooks[1].worksheets[1].range[xxx1];
          range.borders.linestyle :=xlcontinuous;
          k:=k+i-1+ord('A');
          xxx1 :=chr(k);
          xxx1 :='A1:'+xxx1+'1';
          //数据标题列居中
          range:= varexcel.workbooks[1].worksheets[1].range[xxx1];
          range.HorizontalAlignment :=xlCenter;
          range.verticalAlignment := xlCenter;
          range.MergeCells :=true;
          //对报表标题进行修饰
          varexcel.workbooks[1].worksheets[1].range['a1:a1']:=kfb_query.title.Text;
          varexcel.workbooks[1].worksheets[1].range['a1:a1'].Font.Name :='楷体';
          varexcel.workbooks[1].worksheets[1].range['a1:a1'].Font.Size:='18';
          varexcel.workbooks[1].worksheets[1].range['a1:a1'].Font.fontstyle :='bold';
          varexcel.Visible :=true;
       end;
       except
      ShowMessage('数据导出错误!');
      end;
   screen.cursor :=crArrow;
    end;
   end; 
end;
end.

解决方案 »

  1.   

    你的Cell好像都应该加s吧,即cells[x,y],还有就是你没有必要这么应用cell的,可以直接varexcel.Cells[x,y].value,这样表示在当前工作簿添加,同理range也可以这样的,不指明即代表当前啊。还有就是你的字段没必要去判断他是否为空啊,输出的时候会字段转成空的,不过你写了也不错就是了,有点画蛇添足。
      

  2.   

    procedure TFrmXls.SavetoExcel(FileName, TitleCaption: string; makeQuery: TClientDataset; ColCount: Integer; ColVar: OleVariant);
    var
         xlApp, xlSheet: Variant;
         ARow, iLoop: word;
    begin
          //try
      xlApp := CreateOleObject('Excel.Application');
        xlSheet := CreateOleObject('Excel.Sheet');
        xlSheet := xlApp.WorkBooks.Add;
        //表格标题
        xlSheet.WorkSheets[1].Cells[1, 1] :=  TitleCaption;
        for iLoop := 0 to  ColCount-1 do
        begin
           xlSheet.WorkSheets[1].Cells[2, iLoop+1] := ColVar[iLoop];
        end;
        // 数据
        ARow := 3;
        with MakeQuery do
        begin
           First;
           while not Eof do
           begin
              for iLoop := 0 to Fields.Count - 1 do
              begin
                  xlSheet.WorkSheets[1].Cells[ARow, iLoop+1] := Fields[iLoop].AsString;
              end;
              Inc(ARow);
              Next;
           end;
        end;
        try
             xlSheet.SaveAs(FileName);
             Application.MessageBox('导出完毕!', '提示', MB_IconExclamation);
             xlSheet.Close;
        except
        on EOleException do
        end;
        XLApp.displayAlerts:=false;
        XLApp.ScreenUpdating:=true;
        xlApp.Quit;
        xlApp := UnAssigned;
    end;
      

  3.   

    单元应用:Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, DB, DBTables, Grids, DBGrids, ActiveX, ComObj,
    Excel2000, OleServer;测试环境:  OS:Win2k Pro;Excel2k;Delphi6.0源程序:  {
    功能描述:把DBGrid输出到Excel表格(支持多Sheet)
    设计:CoolSlob
    日期:2002-10-23
    支持:[email protected]
    调用格式:CopyDbDataToExcel([DBGrid1, DBGrid2]);
    }
    procedure CopyDbDataToExcel(Args: array of const);
    var
      iCount, jCount: Integer;
      XLApp: Variant;
      Sheet: Variant;
      I: Integer;
    begin
      Screen.Cursor := crHourGlass;
      if not VarIsEmpty(XLApp) then
      begin
        XLApp.DisplayAlerts := False;
        XLApp.Quit;
        VarClear(XLApp);
      end;
      try
        XLApp := CreateOleObject(‘Excel.Application‘);
      except
        Screen.Cursor := crDefault;
      Exit;
      end;
      XLApp.WorkBooks.Add;
      XLApp.SheetsInNewWorkbook := High(Args) + 1;
      for I := Low(Args) to High(Args) do
      begin
        XLApp.WorkBooks[1].WorkSheets[I+1].Name := TDBGrid(Args[I].VObject).Name;
        Sheet := XLApp.Workbooks[1].WorkSheets[TDBGrid(Args[I].VObject).Name];
        if not TDBGrid(Args[I].VObject).DataSource.DataSet.Active then
        begin
          Screen.Cursor := crDefault;
          Exit;
        end;
        TDBGrid(Args[I].VObject).DataSource.DataSet.first;
        for iCount := 0 to TDBGrid(Args[I].VObject).Columns.Count - 1 do
          Sheet.Cells[1, iCount + 1] := TDBGrid(Args[I].VObject).Columns.Items[iCount].Title.Caption;
        jCount := 1;
        while not TDBGrid(Args[I].VObject).DataSource.DataSet.Eof do
        begin
          for iCount := 0 to TDBGrid(Args[I].VObject).Columns.Count - 1 do
            Sheet.Cells[jCount + 1, iCount + 1] := TDBGrid(Args[I].VObject).Columns.Items[iCount].Field.AsString;
          Inc(jCount);
          TDBGrid(Args[I].VObject).DataSource.DataSet.Next;
        end;
      end;
      XlApp.Visible := True;
      Screen.Cursor := crDefault;
    end;