win7 + delphi 7 + Excel2007 不支持CreateOLEObject('Excel.Application') 有没有什么办法解决?

大哥大姐们在线求帮请问一下,win7 + delphi 7 + Excel2007 不支持CreateOLEObject('Excel.Application') 有没有什么办法解决?
最新回答
阡陌

2025-06-21 04:55:00

以前用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');

爱生活爱***

2025-06-21 00:28:04

如果不支持,那就只能使用控件的办法,如果想使用excel2007,这个delphi7自带的控件是不支持的,解决办法有二:

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的引用有什么区别(我印象里好像差不多)。
ぃ伊丽莎白鼠

2025-06-21 10:17:55

我也遇到了同样的问题,不过我发现在有些win7上可以运行,有些不行,估计win7上需要某些组件支持。这样可以应该可以通过安装这些组件来解决。