有以下生成Excel文件的程序,在Delphi5下运行正常,但是在Delphi6.0下提示
null不是“OLEVariant”类型不匹配,ExcelApplication1.Workbooks.Add(null,0);这行通不过。
请高手指点!!!为什么????
procedure TForm_Format.BitBExcelClick(Sender: TObject);
  var
    i,row:integer;
    ExcelApplication1: TExcelApplication;
    ExcelWorkbook1: TExcelWorkbook;
    ExcelWorksheet1: TExcelWorksheet;
    ExcelFileName:String;
begin
    if SaveDialogExcel.Execute then
    begin
      ExcelApplication1:=TExcelApplication.Create(self);
      ExcelWorkbook1:=TExcelWorkbook.Create(self);
      ExcelWorksheet1:=TExcelWorksheet.Create(self);
      Screen.Cursor:=crHourGlass;
      ExcelApplication1.Connect;
      ExcelApplication1.Workbooks.Add(null,0); //..该行不能通过!!!!
      ExcelWorkBook1.ConnectTo(ExcelApplication1.Workbooks[1]);
      ExcelWorkSheet1.ConnectTo(ExcelWorkBook1.Sheets[1] as _WorkSheet);
      ExcelFileName:=SaveDialogExcel.FileName;
      ExcelWOrkSheet1.Cells.Item[1,1]:='楼宇名称';
      ExcelWOrkSheet1.Cells.Item[1,2]:='门牌号码';
      ExcelWOrkSheet1.Cells.Item[1,3]:='计量表名称';
      ExcelWOrkSheet1.Cells.Item[1,4]:='设备序号';
      ExcelWOrkSheet1.Cells.Item[1,5]:='读  数';
      ExcelWOrkSheet1.Cells.Item[1,6]:='计量单位';
      ExcelWOrkSheet1.Cells.Item[1,7]:='抄表日期';
      ExcelWOrkSheet1.Cells.Item[1,8]:='抄表时间';
      QueryHisData.First;
      row:=2;
      While not QueryHisData.Eof do
      begin
          ExcelWOrkSheet1.Cells.Item[row,1]:=QueryHisData.FieldByname('BldName').AsString;
          ExcelWOrkSheet1.Cells.Item[row,2]:=QueryHisData.FieldbyName('DoorPlate').AsString;
          ExcelWOrkSheet1.Cells.Item[row,3]:=QueryHisData.FieldbyName('EquipName').AsString;
          ExcelWOrkSheet1.Cells.Item[row,4]:=QueryHisData.FieldbyName('EquipNo').AsString;
          ExcelWOrkSheet1.Cells.Item[row,5]:=QueryHisData.FieldbyName('PracticeData').AsString;
          ExcelWOrkSheet1.Cells.Item[row,6]:=QueryHisData.FieldbyName('EquipMete').AsString;
          ExcelWOrkSheet1.Cells.Item[row,7]:=QueryHisData.FieldbyName('GDate').AsString;
          ExcelWOrkSheet1.Cells.Item[row,8]:=QueryHisData.FieldbyName('GTime').AsString;
          row:=row+1;
          QueryHisData.next;
      end;
      ExcelWorkBook1.SaveCopyAs(ExcelFileName+'.xls');
      ExcelWOrkBook1.Close(false);
      ExcelApplication1.Disconnect;
      ExcelApplication1.Quit;
      Screen.Cursor:=crDefault;
    end;end;

解决方案 »

  1.   

    ExcelApplication1:=TExcelApplication.Create(self);
          ExcelWorkbook1:=TExcelWorkbook.Create(self);
          ExcelWorksheet1:=TExcelWorksheet.Create(self);
          这三行去掉。
      

  2.   

    同意,ycxuyuq(注册失败) ,我在转换到d6时也遇到过这样的问题。
    解决办法相同!!
      

  3.   

    谢谢ycxuyuq(注册失败) 
    问题解决了,怎么给你加分啊??!!
      

  4.   

    I no tiem 了,我这有一段在DELPHI6中能运行的代码,去看看能否解决
    procedure Tfrm_main.sb_excelClick(Sender: TObject);
    var
       Unassigned: Variant;
       ls_xlsFilename:string;
       eclApp,WorkBook :variant;
       li_fieldcount,li_rec,i,j,li_c :integer;
    begin
       if (DBGrid_EditTableForm.DataSource.DataSet.State=dsInactive) then exit;
       li_rec:=DBGrid_EditTableForm.DataSource.DataSet.RecordCount;
       if (li_rec<1) then exit;
       li_fieldcount :=DBGrid_EditTableForm.FieldCount;
       ls_xlsFilename :=DBText1.Field.AsString+'表结构.xls';
       try
         frm_progress.Show;
         frm_progress.Caption:='正在检查系统是否MS EXCEL';
         eclApp :=CreateOleObject('Excel.Application');
         WorkBook :=CreateOleObject('Excel.Sheet');
       except
         frm_progress.Close;
         MessageDlg('您的系统没有安装MS EXCE!', mtInformation,[mbOk],0);
         exit;
       end;   try
         frm_progress.Caption:='正在构造表结构标题';
         WorkBook :=eclApp.workBooks.add;
         eclApp.cells(1,li_fieldcount div 2) :=DBText1.Field.AsString+'表结构';
         //eclApp.cells(2,1) :='字段名中文含义';
         //eclApp.cells(3,1) :='字    段    名';
         frm_progress.progressbar1.Position:=0;
         frm_progress.progressbar1.Max:=li_fieldcount;
         for i :=1 to  li_fieldcount do      //转化字段名;
         begin
           frm_progress.Caption:='正在构造字段信息......';
           frm_progress.progressbar1.Position:=i;
           eclApp.cells(2,i) :=DBGrid_EditTableForm.Columns[i-1].Title.caption ;
           eclApp.cells(3,i) :=DBGrid_EditTableForm.Fields[i-1].FieldName ;
         end;
         DBGrid_EditTableForm.DataSource.DataSet.First ;
         frm_progress.progressbar1.Position:=0;
         frm_progress.progressbar1.Max:=li_rec*li_fieldcount;
         for i :=1 to  li_rec  do    //recordcount
         begin
           for j :=1 to  li_fieldcount do  //转化一个记录
           begin
             li_c:=li_c+1;
             frm_progress.Caption:='正在构造表结构内容信息......';
             frm_progress.progressbar1.Position:=li_c;
             eclApp.cells(i+3,j) :=DBGrid_EditTableForm.Fields[j-1].AsString;
           end;
           DBGrid_EditTableForm.DataSource.DataSet.Next ;
         end;
         frm_progress.Close;
         try
           WorkBook.saveas(ExtractFilePath(Application.ExeName )+ls_xlsFilename);
           WorkBook.close;
           showmessage('保存EXECL文件成功,路径为:'+ExtractFilePath(Application.ExeName )+ls_xlsFilename);
         except
           MessageDlg('保存文件出错!', mterror,[mbOk],0);
         end;
       except
         frm_progress.Close;
         showmessage('不能正确操作EXECL文件,可能该文件已经被其他程序占用或系统错误');
         WorkBook.close;
         eclApp.quit;
         eclApp :=Unassigned;
       end;
    end;