环境:

Windows XP 机器
Excel 2007 和 Excel 2003 均已安装(按此顺序,而不是按时间顺序)。
C#3.5

问题:

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

var excel = new ApplicationClass();

PIA 的版本专门将其称为 Excel 12。
C:\ WINDOWS \程序集\ GAC \ Microsoft.Office.Interop.Excel \ 12.0.0.0__71e9bce111e9429c \ Microsoft.Office.Interop.Excel.dll
但:

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

因此,当我尝试打开扩展名为 .xlsx 的文件时,它会警告我文件转换中功能丢失,并使用 excel 2003 打开它。我很确定这与安装顺序 2007 -> 2003 有关,但我无法在我的计算机上卸载 2003,因为我们的网络服务器上有一些使用 excel 2003 的不相关项目的办公自动化。

我查看了 Policy.11.0.Microsoft.Office.Interop.Excel.config 内容,但它说

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

所以,我很茫然。为什么我无法告诉 COM Interop 使用哪个版本的 Excel?

有帮助吗?

解决方案

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

然而,在运行 PIA 时,您实际上将针对系统上安装的最高级别的 PIA 运行。因此,如果您针对 Excel 2003 PIA 进行开发,但客户端具有带有 Excel 2007 PIA 的 Excel 2007,则您的代码将针对 Excel 2007 PIA 运行 — 并且它应该运行良好,因为 Excel 2007 PIA 向后兼容。也就是说,每个编号较高的 PIA 版本(和 Excel 对象模型)向后兼容针对旧版 PIA 和旧版 Excel 对象模型编译的命令。请注意,如果客户端计算机上同时具有 Excel 2007 和 Excel 2003 PIA,则无论运行哪个版本的 Excel,都将加载更高版本的 PIA - 因此,如果两个 PIA 都可用,则 Excel 2007 PIA 将运行。

[编辑:需要注意的是,使用 VB.NET 或 C# 4.0 时,Excel 2007 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 版本。

(看 这里 以供进一步讨论。)

我很确定这与安装订单是2007年 - > 2003有关

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

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

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

我曾经在同一台开发机器上有多个版本的 Excel,我个人认为其缺点并不像这些文章听起来那么复杂。一般来说,Excel 2007 PIA 向后兼容 Excel 2003 PIA,并且一切正常。但我曾经遇到过与你类似的注册表混乱,并决定“做正确的事”。我卸载了两者,然后只重新安装了 Excel 2007。

从那里我安装了免费的 Virtual PC(VM ware 实际上更好一点,但它不是免费的),然后在单独的 VM 上安装了 2003、2002、2000 和 '97 的较低版本的 Excel。设置起来确实需要一些工作,但一旦完成,一切就 100% 干净了。

也就是说,我可能实际上不想 发展 相对于 VM 上的较低版本的 Excel,使用 VM 中托管的 Visual Studio 会非常困难。因此,这些虚拟机仅适用于测试部署,以确保您的系统可以针对各种客户端配置运行。合理?

希望这可以帮助!

麦克风

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top