13

环境:

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

问题:

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

var excel = new ApplicationClass();

PIA 的版本专门将其称为 Excel 12。
C:\WINDOWS\assembly\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 有关,但我无法在我的机器 b/c 上卸载 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?

4

1 回答 1

24

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

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

[编辑:一个警告是 Excel 2007 PIA 在使用 VB.NET 或 C# 4.0 时应该 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 太难了。因此,这些 VM 仅适用于测试部署,以确保您的系统可以针对各种客户端配置工作。有道理?

希望这可以帮助!

麦克风

于 2010-02-11T02:33:22.940 回答