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

 我来答
wangzhi837
2012-09-14
知道答主
回答量:6
采纳率:0%
帮助的人:4050
展开全部

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

windblast
2012-04-11 · 知道合伙人软件行家
windblast
知道合伙人软件行家
采纳数:5633 获赞数:13622
毕业于空军第一航空学院电子专业,1991年开始接触电脑,从事多年计算机编程,具有较丰富的经验。

向TA提问 私信TA
展开全部
如果不支持,那就只能使用控件的办法,如果想使用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的引用有什么区别(我印象里好像差不多)。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友9f69403
2013-04-10
知道答主
回答量:13
采纳率:0%
帮助的人:3.9万
展开全部
我也遇到了同样的问题,不过我发现在有些win7上可以运行,有些不行,估计win7上需要某些组件支持。这样可以应该可以通过安装这些组件来解决。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式