有以下生成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;
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;
ExcelWorkbook1:=TExcelWorkbook.Create(self);
ExcelWorksheet1:=TExcelWorksheet.Create(self);
这三行去掉。
解决办法相同!!
问题解决了,怎么给你加分啊??!!
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;