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

如何在com自动化中启动特定的excel版本?,excel,com,automation,Excel,Com,Automation,我通过COM自动化(在c#中)使用Excel,但问题似乎无法控制在框上启动哪个版本的Excel-我们同时使用Excel 9和Excel 11,一组特定的电子表格需要Excel 9,否则它们无法工作 我包括了excel 9 com引用,但在另一台个人计算机上启动了excel 11。我怎样才能解决这个问题 这篇文章可能有用: 像上面的评论一样,我不清楚为什么Excel 11在Excel 9电子表格中会出现问题,我不确定Excel使用的ProgId(CLSID GUI上的友好名称),但快速查看一下,

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


我包括了excel 9 com引用,但在另一台个人计算机上启动了excel 11。我怎样才能解决这个问题

这篇文章可能有用:


像上面的评论一样,我不清楚为什么Excel 11在Excel 9电子表格中会出现问题,我不确定Excel使用的ProgId(CLSID GUI上的友好名称),但快速查看一下,我会发现“Excel.Application”是您可能激活的类型

在HKEY_CLASSES_ROOT下查看,在我的机器上我看到“Excel.Application”和“Excel.Application.12”,我怀疑您正在激活“Excel.Application”,如果您在“Excel.Application”下的“CurVer”键下查看,它会指向“Excel.Application.12”,请在您的复制机器上检查此值

我猜您正在启动Excel.Application,如果目标计算机上存在程序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. 

好的,在切换到Phils建议的活化剂溶液后,我检查了两台表现不同的机器。这两台机器都有Excel.Application.9中的CurVer注册表项;但是一个从11开始,一个从9开始。到目前为止,我还是有点不知所措

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


还有什么建议吗

在这两台不同的机器上,progid for Excel.Application.9和.11中的类ID GUID表示什么

要获得特定的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窗口的句柄。由于这是一项稍多的工作,我将简单地引用以下问题,其中对所有内容进行了详细描述:


这与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,否则只需删除“command”值。

大多数用户不会在同一个框中使用两个不同版本的Excel。作为开发人员,您可以,但用户通常不会。如果用户的计算机上有Excel 11.0或更高版本,而您需要Excel 9.0,那么您就有问题了……也许您想解释一下为什么工作表不能在更高版本的Excel上正确运行?通常情况下,更高版本的excel应该能够毫无困难地运行excel 9.0电子表格。我们使用的文件是极其复杂的手动计算vba怪物,我相信在范围相交或类似行为方面,9->11有一些变化。由于上述问题,我们所有的用户都有9和11。