win7 + delphi 7 + Excel2007 不支持CreateOLEObject('Excel.Application') 有没有什么办法解决?
以前用Delphi6+Excel2003,导出语句CreateOleObject('Excel.Application');很正常,但改为Excel2007精简版之后就会出现“无效的类别字符串”错误。
后来查CreateOleObject函数的代码如下:
function CreateOleObject(const ClassName: string): IDispatch;
var
ClassID: TCLSID;
begin
ClassID := ProgIDToClassID(ClassName);
OleCheck(CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER or
CLSCTX_LOCAL_SERVER, IDispatch, Result));
end;
再查ProgIDToClassID函数的代码如下:
function ProgIDToClassID(const ProgID: string): TGUID;
begin
OleCheck(CLSIDFromProgID(PWideChar(WideString(ProgID)), Result));
end;
再进入Regedit注册表里,查ProgID中有“Excel”的字符串,终于发现了Office2007的是“Excel.Sheet.12”。于是变更程序代码如下,结果测试成功:
uses ComObj;
procedure TForm1.Button2Click(Sender: TObject);
var MyWorkbook:Variant;
begin
MyWorkbook := CreateOleObject('Excel.Sheet.12');//对于Excel2007,不能再用Excel.Application
MyWorkbook.Application.WorkBooks.Add;
MyWorkbook.Application.Visible := true;
end;
现在我终于可以从Delphi导出数据到Excel2007了。
另,如果安装的是Office2007完整版,就可直接使用CreateOleObject('Excel.Application');如果安装的是精简版,只能用CreateOleObject('Excel.Sheet.12');
2012-04-11 · 知道合伙人软件行家
1. 自己导入excel2007的动态库。
2. 使用第三方控件,比如NativeExcel。
顺便提一句: 貌似COM方式应该是兼容性最好的吧,怎么不支持呢?
1. 不是excel2007的问题,在XP下 XP+delphi7 +excel2007 可以导出,没有问题。
2. NativeExcel 我看了下,不知道有没有支持曲线功能
我的程序是引用的excelXP单元。
try
FMyExcel := CreateOleObject('Excel.Application');
FMyExcel.Visible := False;
FMyExcel.DisplayAlerts := false;
FExcelOK:= True;
except
ShowDialog('系统没有安装Excel,不能导出.', dtWarnning);
Exit;
end;
以下我编写的用com调用excel的代码,运行正常:
procedure TForm1.btnExcelClick(Sender: TObject);
var ExcelApp: Variant;
begin
ExcelApp := CreateOleObject('Excel.Application');
ExcelApp.Visible := True;
ExcelApp.Caption := '应用程序调用 Microsoft Excel';
ExcelApp.WorkBooks.Open( 'e:\test\test.xls' );
ExcelApp.WorkSheets['sheet1'].Activate;
ExcelApp.Cells[1,4].Value := '第一行第四列';
ExcelApp.ActiveWorkBook.save;
ExcelApp.ActiveWorkBook.Saved := True;
ExcelApp.Quit;
end;
我的运行环境: win7(32)+delphi2010+excel2003
你可以检查下是不是excel2007的引用有什么区别(我印象里好像差不多)。