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

我通过COM自动化(在C#中)使用Excel,但似乎问题无法控制哪个版本的Excel是开始在盒子上 – 我们同时使用Excel 9和Excel 11和一套特定的电子表格需要excel 9否则他们不会工作。

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

我不确定用于Excel的ProgId(在CLSID Guids上的友好名称),但是快速查看会导致我将“Excel.Application”作为您可能激活的types。

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

我的猜测是你正在启动Excel.Application,你可能想要强制它启动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. 

这与CurVer无关。 这是COM。 与所有COM应用程序一样,Windows通过引用registry中相关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安装。

要更改此行为,请将path更改为指向OFFICE12(或OFFICE14)path。 Windows将首先使用该命令的Unicode变体(这是无法理解的)。 所以除非你知道如何更新Unicode,否则只要删除'command'值。

本文可能有用:

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

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

好,所以我检查了两个给予不同行为的机器,在转换到Philsbuild议的Activator解决scheme之后。 这两台机器都在CurVer regkey中有Excel.Application.9; 但一个开始11,一个开始9.到目前为止,我仍然有点亏损。

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

还有什么build议?

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

要获得特定的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窗口的句柄。 由于这是一个更多的工作,我将简单地引用下面的问题,其中的一切都详细描述:

如何使用后期绑定来获得excel实例?