尝试使用 Excel 2007 进行办公自动化,但继续使用 Excel 2003
Posted
技术标签:
【中文标题】尝试使用 Excel 2007 进行办公自动化,但继续使用 Excel 2003【英文标题】:Trying to do Office Automation with Excel 2007, but keeps using Excel 2003 【发布时间】:2011-01-15 10:01:55 【问题描述】:环境:
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,但我无法在我的机器上卸载 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>
所以,我很茫然。为什么我不能告诉 COM Interop 使用哪个版本的 Excel?
【问题讨论】:
您可以尝试修复 excel 2007 看看是否可以解决问题吗? 这是可能的,但我担心当我必须处理它时,它会提升 2003 年网站代码的 PIA。我想我可以来回弹跳,但我有点担心一旦安装在我们内部用户的机器上会如何工作。 它不会改变 PIA。您可以检查 GAC 来确定,但 99.99% 可以肯定您的机器上已经同时安装了 Excel 2003 和 Excel 2007 PIA。因此,PIA 设置不会因修复而改变。但是修复应该修复注册表以使当前版本为 Excel 2007 而不是 Excel 2003。有关更多详细信息,请参阅下面的答案。 【参考方案1】:您无法以编程方式命令使用哪个版本的 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 版本。
(更多讨论请参见here。)
我很确定这与 安装顺序为 2007 -> 2003
是的,这是 100% 正确的。您可以尝试在 Excel 2007 上运行修复,这将是最简单的操作。如果这不起作用,那么我将卸载它们,然后重新安装它们。我将卸载 Excel 2003,然后卸载 2007(颠倒安装它们的顺序),然后安装 Excel 2003,然后安装 Excel 2007,这样您就可以按照正确的顺序安装这两个版本。
但请记住,通过这样做,Excel 2007 将在您调用 Excel.Application excelApp = new Application()
时默认运行。
实际推荐的做法是不让两个版本的 Excel 都在开发人员的机器上运行。有关这方面的更多信息,请参阅:
Why is VS development not supported with multiple versions of Office? Can you build one add-in for multiple versions of Office? Writing Automation clients for multiple Office versions我曾经在同一台开发机器上拥有多个版本的 Excel,我个人觉得缺点并不像这些文章所说的那么复杂。通常,Excel 2007 PIA 向后兼容 Excel 2003 PIA,并且一切正常。但是我曾经陷入与您类似的注册表混乱并决定“做正确的事”。我都卸载了,然后只重新安装了 Excel 2007。
从那里我安装了 Virtual PC,它是免费的(VM ware 实际上稍微好一点,但它不是免费的),然后在单独的 VM 上安装了用于 2003、2002、2000 和 '97 的较低版本的 Excel。设置肯定是一些工作,但是一旦你这样做了,一切都是 100% 干净的。
也就是说,我可能不想真正开发虚拟机上的低版本 Excel,使用虚拟机中托管的 Visual Studio 太难了。因此,这些 VM 仅适用于测试部署,以确保您的系统可以针对各种客户端配置工作。有意义吗?
希望这会有所帮助!
迈克
【讨论】:
这是令人难以置信的丰富信息,谢谢。我唯一担心的是我们网站所在的网络服务器没有 Excel 2007 PIA。它只到 2003 年。我必须尝试一下,看看是否可行。实际上,我认为我的 BA 提供的模板正在降级为兼容 2003 的 .xls b/c,根据经理的说法,这是阻力最小的路径。如果有机会,我一定会试试这个。 很高兴它有帮助。 :-) 在这种情况下,您应该能够在您的开发机器上引用 2003 PIA,您会没事的。但是请记住,当您实际运行和调试时,您将运行 2007 PIA,因为听起来您的系统上同时具有2003 和2007 PIA。但是,这应该可以正常运行,因为 PIA 是向后兼容的。但是,当您部署到 Excel 2003 系统时,***别的 PIA 应该是 2003 PIA,因此它将运行它。然而,这都是“理论上的”——最好对此进行大量测试。 同样,最好的办法是在您的开发机器上只安装 Excel 2003,阅读上面列出的 Andrew Whitechapel 文章是关键。但是,如果您必须在您的系统上同时拥有这两者,那么只需参考 Excel 2003 PIA,您应该就可以了。但一定要广泛测试。不过,就我个人而言,我切换到只有一个版本的 Excel 在我的机器上,而所有其他版本都在 VM 中,我很高兴我做出了切换。从长远来看,您需要考虑一些事情。以上是关于尝试使用 Excel 2007 进行办公自动化,但继续使用 Excel 2003的主要内容,如果未能解决你的问题,请参考以下文章
Python 自动化办公之 Excel 模块 — openpyxl 的基本使用!