代码之家  ›  专栏  ›  技术社区  ›  Andy_Vulhop

尝试使用Excel2007进行Office自动化,但继续使用Excel2003

  •  12
  • Andy_Vulhop  · 技术社区  · 16 年前

    环境:

    Windows XP计算机
    Excel2007和Excel2003都已安装(按顺序,而不是按时间顺序)。
    C 3.5

    问题:

    当我使用PIA进行一些办公自动化时,我使用以下代码行:

    var excel = new ApplicationClass();
    

    PIA的版本专门将其称为Excel 12。
    C:\windows\assembly\gac\microsoft.office.interop.excel\12.0.0.0_uu71e9bce111e9429c\microsoft.office.interop.excel.dll
    但是:

     excel.Version;//this is 11.0 instead of 12.0
    

    因此,当我试图打开一个扩展名为.xlsx的文件时,它会警告我文件转换中的功能丢失,并用Excel2003打开它。我很肯定这与安装订单2007->2003有关,但我无法在我的计算机b/c上卸载2003。对于使用Excel 2003的无关项目,我们的Web服务器上有一些Office自动化。

    我看过policy.11.0.microsoft.office.interop.excel.config文件,但它说

    <bindingRedirect oldVersion="11.0.0.0" newVersion="12.0.0.0"></bindingRedirect>
    

    所以,我不知所措。为什么我不能告诉COM Interop要使用哪个版本的Excel?

    1 回复  |  直到 14 年前
        1
  •  23
  •   Mike Rosenblum    15 年前

    不能以编程方式命令使用哪个版本的Excel。PIA只规定了您要开发的接口或对象模型。但实际运行的Excel版本由注册表控制。

    但是,当涉及到运行PIA时,您将实际运行系统上安装的最高级别PIA。因此,如果您是针对Excel2003 PIA开发的,但是客户机有Excel2007和Excel2007 PIA,那么您的代码将针对Excel2007 PIA运行——并且应该运行良好,因为Excel2007 PIA是向后兼容的。也就是说,每个编号较高的PIA版本(和Excel对象模型)都向后兼容根据旧的PIA和旧的Excel对象模型编译的命令。请注意,如果客户机上同时有Excel2007和Excel2003 PIA,则无论运行的是哪个版本的Excel,都会加载更高版本的PIA—因此,如果两个PIA都可用,Excel2007 PIA将运行。

    [编辑:一个警告是,使用vb.net或c 4.0时,Excel2007 PIA应100%向后兼容。如果使用C 3.0或更低版本,当从C 3.0或更低版本调用时,实际上需要可选参数这一事实将在针对更高版本PIA或对象模型运行时在某些代码中创建一个中断。不过,这是相对罕见的,而且随着C 4.0的出现,理论上这个问题应该会消失。]

    好的,所以您对PIA没有很大的控制权,因为您开发的PIA实际上并不能控制哪个PIA将在客户机上运行。

    你也不能很好地控制Excel的哪个版本被启动。例如,当您通过以下方式创建新的Excel实例时:

    Excel.Application excelApp = new Application();
    

    加载的Excel应用程序根据注册表中设置的当前版本进行设置。当前版本保存在:

    HKEY_CLASSES_ROOT\Excel.Application\CurVer
    

    在您的示例中,“curver”键的默认值为“excel.application.11”,而不是“excel.application.12”。单独更改这一点可能会有帮助,但我更愿意进行修复,而不是确保正确更正所有注册表设置。(我不可能知道所有的设置应该是什么。)好的,我刚找到另一个:你还需要更改:

    [HKEY_CLASSES_ROOT\CLSID\{00024500-0000-0000-C000-000000000046}\ProgID]
    

    保存值“excel.application.12”。但我强烈建议您改为运行修复程序。我不知道还有哪些设置需要更改,所以手动更改这些设置有点冒险。

    此外,还应找到以下键:

    HKEY_CLASSES_ROOT\Excel.Application.11
    HKEY_CLASSES_ROOT\Excel.Application.12
    

    因为这些是您安装的Excel版本。

    (见 here 以便进一步讨论。)

    我很肯定这和 安装订单为2007->2003

    是的,这是100%正确的。您可以尝试在Excel2007上运行修复,这是最简单的操作。如果这不起作用,那么我将卸载这两个,然后重新安装这两个。我先卸载Excel2003,然后卸载2007(与安装顺序相反),然后安装Excel2003,然后安装Excel2007,以便以正确的顺序安装这两个版本。

    但请记住,通过这样做,Excel2007将在调用时默认运行。 Excel.Application excelApp = new Application() .

    实际推荐做法是 在开发人员的计算机上运行两个版本的Excel。有关更多信息,请参阅:

    我以前在同一台开发机器上有多个版本的Excel,我个人认为其缺点并没有这些文章听起来那么复杂。一般来说,Excel2007 PIA与Excel2003 PIA向后兼容,一切正常。但有一次我陷入了和你类似的注册表混乱,决定“做正确的事情”。我同时卸载了这两个,然后只重新安装了Excel2007。

    从那里,我安装了免费的虚拟PC(虚拟机软件实际上更好一点,但不是免费的),然后在单独的虚拟机上安装了我较低版本的Excel2003、2002、2000和97。这肯定是一些工作要建立,但一旦你这样做,一切都是100%干净。

    也就是说,我可能不想 发展 相对于虚拟机上较低版本的Excel,在虚拟机中使用Visual Studio太难了。因此,这些虚拟机只适用于测试部署,以确保您的系统能够针对各种客户机配置工作。有道理?

    希望这有帮助!

    迈克