尝试使用Excel 2007执行Office自动化,但仍使用Excel 2003

环境:

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的文件时,它会警告我在文件转换中丢失的function,并用excel 2003打开它。我非常肯定它与安装顺序是2007 – > 2003有关,但我不能卸载2003在我的机器上我们有一些办公自动化在我们的networking服务器上使用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版本是由registry控制的。

但是,在运行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或对象模型运行时在某些代码中创build中断。 这是相对罕见的,而用C#4.0,这个问题应该在理论上消失。

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

您无法控制启动哪个版本的Excel。 例如,当您通过以下方式创build新的Excel实例时:

 Excel.Application excelApp = new Application(); 

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

 HKEY_CLASSES_ROOT\Excel.Application\CurVer 

它看起来像你的案例中的'CurVer'键将有一个默认值'Excel.Application.11',而不是'Excel.Application.12'。 单独改变这一点可能会诀窍,但我宁愿做一个修复,而不是确保所有的registry设置得到正确的纠正。 (我不可能知道所有的设置应该是什么)好吧,我刚刚find另一个:你也需要改变:

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

保存“Excel.Application.12”的值。 但是我强烈build议运行修复。 我不知道还有哪些设置可能需要更改,所以手动更改设置有点危险。

另外,您还应该find以下键:

 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。 有关更多信息,请参阅:

  • 为什么VS开发不支持多个版本的Office?
  • 你能为多个版本的Office创build一个加载项吗?
  • 编写多个Office版本的自动化客户端

我以前在同一个开发机器上有多个版本的Excel,我个人觉得这些缺点并不像这些文章那么复杂。 一般来说,Excel 2007 PIA向后兼容Excel 2003 PIA,一切正常。 但是我曾经陷入过类似于你的registry问题,并决定“做正确的事情”。 我卸载,然后只重新安装Excel 2007。

从那里我安装了免费的虚拟PC(虚拟机软件实际上是一个更好的,但它不是免费的),然后安装我的较低版本的Excel 2003,2002,2000和'97在单独的虚拟机。 这绝对是一些成立的工作,但一旦你这样做,一切都是100%干净。

也就是说,我可能不希望在虚拟机上实际开发较低版本的Excel,但使用虚拟机中托pipe的Visual Studio太难了。 所以这些虚拟机只适用于testing部署,以确保您的系统可以针对不同的客户端configuration。 合理?

希望这可以帮助!

麦克风