尝试使用Excel 2007执行Office Automation,但继续使用Excel 2003

And*_*hop 12 c# com excel pia office-interop

环境:

Windows XP计算机
安装了Excel 2007和Excel 2003(按此顺序,而不是按时间顺序).
C#3.5

问题:

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

var excel = new ApplicationClass();
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

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

<bindingRedirect oldVersion="11.0.0.0" newVersion="12.0.0.0"></bindingRedirect>
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*lum 23

您无法以编程方式命令使用哪个版本的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将运行.

[编辑:有一点需要注意,使用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();
Run Code Online (Sandbox Code Playgroud)

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

HKEY_CLASSES_ROOT\Excel.Application\CurVer
Run Code Online (Sandbox Code Playgroud)

看起来您的案例中的"CurVer"键的默认值为"Excel.Application.11",而不是"Excel.Application.12".单独更改此功能可能会有所帮助,但我更愿意进行修复,以确保正确更正所有注册表设置.(而且我不可能知道所有设置应该是什么.)好的,我刚发现另一个:你还需要改变:

[HKEY_CLASSES_ROOT\CLSID\{00024500-0000-0000-C000-000000000046}\ProgID]
Run Code Online (Sandbox Code Playgroud)

保持值"Excel.Application.12".但我强烈建议改为维修.我不知道其他设置可能需要更改,因此手动更改它们有点冒险.

此外,您还应该找到以下键:

HKEY_CLASSES_ROOT\Excel.Application.11
HKEY_CLASSES_ROOT\Excel.Application.12
Run Code Online (Sandbox Code Playgroud)

因为这些是您已安装的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%干净.

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

希望这可以帮助!

麦克风