2009-01-18 59 views
1

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

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

+0

大多数用户在同一个框上不会有两个不同版本的Excel。作为一名开发人员,你可能会这样做,但用户通常不会。如果用户在他们的机器上安装了Excel 11.0或更高版本,并且您需要Excel 9.0,那么您遇到了问题... – 2009-01-18 21:11:29

+0

也许您可能想解释为什么工作表无法在更高版本的Excel上正常运行?通常,较高版本的Excel应该能够毫无困难地运行Excel 9.0电子表格。 – 2009-01-18 21:12:31

回答

0

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

看一下HKEY_CLASSES_ROOT,在我的机器上我看到“Excel.Application”和“Excel.Application.12”,我怀疑你正在激活“Excel.Application”,如果你看下“CurVer”键在“Excel.Application”下,它指向“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. 
0

行,所以我检查了两台机器这给不同的行为,switiching到菲尔斯后提示激活解决方案。这两台机器都在CurVer regkey中有Excel.Application.9;但是一开始11,一开始9.到目前为止,我仍然有点亏损。

我从Excel.Application.9返回的类型对象有XL11的一些证据内部调试指出。

还有什么建议吗?

0

什么做的类ID的GUID的进程id对Excel.Application.9和0.11说在两台不同的机器?

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?

5

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

为Excel的CLSID是:

{00024500-0000-0000-C000-000000000046} 

如果你看一下下HKCR \ CLSID这个键(HKCR \ Wow6432Node \ CLSID为您运行的是Windows的64位版本),你会看到这些键。如果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'值。