我通过COM自动化(在C#中)使用Excel,但似乎问题无法控制在该框上启动的Excel版本 - 我们同时使用Excel 9和Excel 11,并且一组特定的电子表格需要使用excel 9否则他们不会工作。如何在com自动化中启动特定的excel版本?
我包含了excel 9 com引用,但在另一个人机器上启动了excel 11。我怎样才能解决这个问题 ?
我通过COM自动化(在C#中)使用Excel,但似乎问题无法控制在该框上启动的Excel版本 - 我们同时使用Excel 9和Excel 11,并且一组特定的电子表格需要使用excel 9否则他们不会工作。如何在com自动化中启动特定的excel版本?
我包含了excel 9 com引用,但在另一个人机器上启动了excel 11。我怎样才能解决这个问题 ?
我不能确定的问题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.
这篇文章可能是有用的:
http://forums.devx.com/showthread.php?p=457900#post457900
像上面提意见,这是我不清楚为什么的Excel 11将有一个Excel 9表格
行,所以我检查了两台机器这给不同的行为,switiching到菲尔斯后提示激活解决方案。这两台机器都在CurVer regkey中有Excel.Application.9;但是一开始11,一开始9.到目前为止,我仍然有点亏损。
我从Excel.Application.9返回的类型对象有XL11的一些证据内部调试指出。
还有什么建议吗?
什么做的类ID的GUID的进程id对Excel.Application.9和0.11说在两台不同的机器?
为了得到一个特定的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为您运行的是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'值。
大多数用户在同一个框上不会有两个不同版本的Excel。作为一名开发人员,你可能会这样做,但用户通常不会。如果用户在他们的机器上安装了Excel 11.0或更高版本,并且您需要Excel 9.0,那么您遇到了问题... – 2009-01-18 21:11:29
也许您可能想解释为什么工作表无法在更高版本的Excel上正常运行?通常,较高版本的Excel应该能够毫无困难地运行Excel 9.0电子表格。 – 2009-01-18 21:12:31