【问题标题】:How can I start a specific excel version in com automation?如何在 com 自动化中启动特定的 excel 版本?
【发布时间】:2009-01-18 15:33:53
【问题描述】:

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

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

【问题讨论】:

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

标签: excel com automation


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我不确定用于 Excel 的 ProgId(CLSID Guids 上的友好名称),但快速浏览会引导我找到“Excel.Application”,因为您可能会激活该类型。

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

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

    【讨论】:

      【解决方案3】:

      这篇文章可能有用:

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

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

      【讨论】:

        【解决方案4】:

        好的,在切换到 Phils 建议的 Activator 解决方案后,我检查了两台给出不同行为的机器。两台机器的 CurVer regkey 中都有 Excel.Application.9;但是一个从 11 开始,一个从 9 开始。到目前为止,我仍然有点茫然。

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

        还有什么建议吗?

        【讨论】:

          【解决方案5】:

          progid 的 Excel.Application.9 和 .11 中的 Class ID Guid 在两台不同的机器上是什么意思?

          【讨论】:

            【解决方案6】:

            要获得特定的 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?

            【讨论】:

              猜你喜欢
              • 2011-04-01
              • 1970-01-01
              • 2010-11-20
              • 1970-01-01
              • 2020-12-27
              • 1970-01-01
              • 2022-10-31
              • 2012-02-18
              • 1970-01-01
              相关资源
              最近更新 更多