如何在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实例?