如何在com自动化中启动特定的Excel版本?

时间:2009-01-18 15:33:53

标签: excel com automation

我通过COM自动化使用Excel(在c#中),但似乎问题无法控制在盒子上启动的excel版本 - 我们同时使用Excel 9和Excel 11以及一组特定的电子表格需要excel 9否则他们就不会工作。

我包括excel 9 com参考,但在另一个人机器excel 11开始。我怎样才能解决这个问题 ?

6 个答案:

答案 0 :(得分:6)

这与CurVer无关。这是COM。与所有COM应用程序一样,Windows通过引用注册表中相关CLSID项中的LocalServer或InprocServer设置来了解如何启动它们。

Excel的CLSID是:

{00024500-0000-0000-C000-000000000046}

如果您在HKCR \ CLSID(HKCR \ Wow6432Node \ CLSID,您运行的是64位版本的Windows)下查看此密钥,您将看到这些密钥。如果安装了Excel 2003和Excel 2007,则所有这三个键都是:

HKCR\Excel.Appplication
HKCR\Excel.Appplication.11
HKCR\Excel.Appplication.12

将指向相同的CLSID,这就是为什么Windows只知道如何启动一个版本的Excel。

如果您发现Excel 2003正在启动它,因为CLSID的子键指向OFFICE11安装。

要更改此行为,请更改指向OFFICE12(或OFFICE14)路径的路径。 Windows将首选使用命令的Unicode变体(这是难以理解的)。因此,除非您知道如何更新Unicode,否则只需删除“命令”值。

答案 1 :(得分:0)

本文可能有用:

http://forums.devx.com/showthread.php?p=457900#post457900

与上述评论者一样,我不清楚为什么Excel 11会出现Excel 9电子表格的问题

答案 2 :(得分:0)

我不确定用于Excel的ProgId(用于CLSID Guids的友好名称),但快速浏览一下,我可以选择'Excel.Application'作为您可能激活的类型。

看一下HKEY_CLASSES_ROOT,在我的机器上看到“Excel.Application”和“Excel.Application.12”,我怀疑你正在激活“Excel.Application”,如果你看下面的“CurVer”键“Excel.Application”它指向“Excel.Application.12”,在你的repro机器上检查这个值。

我的猜测是你正在启动Excel.Application,如果你的目标机器上存在prog id,你可能想强制它启动Excel.Application.9。

这是一个小代码示例:

Type excel9Type = Type.GetTypeFromProgID("Excel.Application.9");
Type excelType = Type.GetTypeFromProgID("Excel.Application");

if (excelType == excel9Type)
{
    Console.WriteLine("Default Excel.Application is pointing to 'Verion 9' yay");
}
else
{
    Console.WriteLine("Excel is installed, but it's not 'Version 9'");
}

if (excel9Type == null)
{
    throw new InvalidOperationException("Excel.Application.9 is not a registered progid");
}

object excelApplication = Activator.CreateInstance(excel9Type);

// Cast excelApplication to whatever you are using as your application type. 

答案 3 :(得分:0)

好的,所以我检查了两台具有不同行为的机器,在开始Phils建议使用Activator解决方案之后。这两台机器在CurVer regkey中都有Excel.Application.9;但是一个开始11,一个开始9.到目前为止,我仍然有点亏。

我在调试器中注意到从Excel.Application.9返回的Type对象里面有一些XL11的证据。

还有什么建议吗?

答案 4 :(得分:0)

Excel.Application.9和.11的progid中的Class ID Guids在两台不同的机器上说了什么?

答案 5 :(得分:0)

要获取特定的Excel版本,您可以使用

直接启动二进制可执行文件
System.Diagnostics.Process process = System.Diagnostics.Process.Start(@"C:\Program Files\Microsoft Office\Office11\Excel.exe");
int processId = process.Id;

这将为您提供Excel流程的ID。您现在可以连接到此Excel实例,并可以通过调用AccessibleObjectFromWindow来获取对象模型。

此方法要求您使用P / Invoke,并且还必须首先获得Excel窗口的句柄。由于这是一项更多的工作,我将简单地引用以下问题,其中详细描述了所有内容:

  

<强> How to use use late binding to get excel instance?