【问题标题】:How to choose the version of excel which win32com.client has to use in python?如何选择win32com.client在python中必须使用的excel版本?
【发布时间】:2013-07-31 09:46:43
【问题描述】:

我有一个 excel 2007 文件 (*.xlsx),它将通过 python 脚本打开。但问题是我的电脑上安装了两个版本的 MS Office(2003 和 2007)。尽管我尝试将 Excel 2007 作为打开 xlsx 文件的默认应用程序,但 win32com.client 正在尝试使用 Excel 2003 打开我的 xlsx 文件。这也将 Excel 2003 恢复为默认应用程序。

有没有办法强制win32com.client选择Excel 2007打开xlsx文件?

【问题讨论】:

  • 您尝试过下面列出的任何解决方案吗?

标签: python windows excel win32com


【解决方案1】:

对于 Excel 2013,您可以键入:

o = win32com.client.Dispatch("Excel.Application.15")

因为程序位于以下位置:

C:\Program Files (x86)\Microsoft Office\Office15\EXCEL.EXE 

由于我没有安装任何其他版本,我想如果您只需将15 替换为您需要的版本即可。您可以看到命令启动的二进制文件的路径,例如。进程浏览器。

编辑:这是不可能的“以编程方式”:(

试过之后:

excel15 = win32com.client.dynamic.Dispatch("Excel.Application.15")
excel14 = win32com.client.dynamic.Dispatch("Excel.Application.14")

产生这样的对象:

>> print excel15
<COMObject Excel.Application.15>
>> print excel14
<COMObject Excel.Application.14>

只有一个 Excel (14) 实例在进程资源管理器中可见。在做

excel15.Visible = True

确认。

事实证明,使用自动化来控制两个版本的 Excel 是不可能的。 检查注册表,程序(Excel.Application.14 和15)共享相同的 CLSID。每个 CLSID 只有一个 LocalServer(我的计算机上的 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{00024500-0000-0000-C000-000000000046}\LocalServer)。 此 LocalServer 指向我计算机上最后安装的版本 Excel14(试用版)。这是Dispatch 调用创建的唯一对象。

所有这些都在here 进行了解释(§“使用自动化控制 Microsoft Excel”)。

有希望

正如我所说,这个LocalServer 指向最后安装的版本。因此,您有机会实现您想要的:

  • 您有信心手动更改注册表。我会说“简单”(更改LocalServer 指向的应用程序,以及Excel.Application 条目的默认应用程序),但我更喜欢以下简单的解决方案
  • 重新安装 2007 应用程序(当然,如果可以的话)。这是一个糟糕/不优雅但简单的解决方法。

【讨论】:

  • 我安装了 2013 和 2010。我希望发送 Excel 2010,因此尝试了o = win32com.client.Dispatch("Excel.Application.14")。但 Excel 2013 已调度。
  • 更改LocalServer 不会产生任何影响
【解决方案2】:

以下应该可以工作,因为我已经对其进行了测试,尽管没有同时安装两个版本的 Excel,而是强制 Excel 文件在 Word 中打开(又名 WINWORD.exe)。替换您要使用的任何 Excel 版本的路径:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.xlsx]
"Content Type"="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
@="Excel.Sheet.Custom"
"PerceivedType"="document"

[HKEY_CLASSES_ROOT\.xlsx\Excel.Sheet.Custom]

[HKEY_CLASSES_ROOT\Excel.Sheet.Custom\shell\Open]
@="&Open"

[HKEY_CLASSES_ROOT\Excel.Sheet.Custom\shell\Open\command]
@="\"C:\\Program Files\\Microsoft Office\\Office14\\EXCEL.EXE\" /dde"

[HKEY_CLASSES_ROOT\Excel.Sheet.Custom\shell\Open\ddeexec]
@="[open(\"%1\")]"

[HKEY_CLASSES_ROOT\Excel.Sheet.Custom\shell\Open\ddeexec\application]
@="Excel"

[HKEY_CLASSES_ROOT\Excel.Sheet.Custom\shell\Open\ddeexec\topic]
@="system"

在将C:\\Program Files\\Microsoft Office\\Office14\\EXCEL.EXE 替换为您希望默认使用的实际EXCEL.exe 的路径后保存上述reg 脚本(注意\\s),在you_name_it.reg 和运行/合并/双击它。它会要求您确认,给予肯定并检查。

【讨论】:

  • 您是否尝试过您的解决方案并且是否有效?我不想根据假设更改我的设置。
  • @richie 回滚更改就像导出当前的[HKEY_CLASSES_ROOT\.xlsx](作为备份)或复制值Excel.Sheet.XX 并删除[HKEY_CLASSES_ROOT\.xlsx\Excel.Sheet.Custom] 一样简单。
  • 感谢@hus787。如果可能的话,你能给出一步一步的指导来完成你的方法吗?
【解决方案3】:

我没有尝试过,但也许你可以使用类似的东西来启动你想要的 Excel 版本

desired_excel_path = 'C:\\Program Files\\Microsoft Office\\Office14\\EXCEL.EXE'
file_path = 'C:\\myfile.xlsx'

subprocess.call([desired_excel_path , file_path])

(或任何手动启动 Excel 的子流程方法)然后尝试

wb = win32com.client.GetObject(file_path) 

获取正在运行的实例。

【讨论】:

  • 尝试上述log4net:ERROR XmlHierarchyConfigurator: Cannot find Property [add] to set object on [log4net.Repository.Hierarchy.Hierarchy]时出现以下错误@
【解决方案4】:

您是否尝试通过EnsureModule 加载模块?
用法是:

from win32com.client import gencache
mod = gencache.EnsureModule('clsID', 'lcID','versionMajor', 'versionMinor')

您可以从lib/site-packages/win32com/client 文件夹中的python makepy.py -i 中检索所有需要的内容
它将打开一个窗口,您可以在其中选择所需的应用程序。您会在其中找到两个 Excell 版本,选择所需的一个,它将返回如何将其连接到 python。



从这里您将有两个选择。
1) excel = mod.Application 应该为您提供应用程序调度,但您可能无法看到其中的属性(但版本应该是正确的并且命令应该像往常一样工作)。

2) excel = win32com.client.Dispatch("Excel.Application") 应该使用您刚刚生成的模块(但我不确定这是否可行并带来正确的版本!)。

【讨论】:

  • 我使用选项 1) 来控制另一个软件,而不是 Excel。软件不支持 EnsureDispatch 方法提供的早期绑定时需要它。我没有尝试使用 Excel 本身进行版本选择,因为我没有安装两个版本,但我无法想象为什么它不起作用。
猜你喜欢
  • 2022-10-02
  • 1970-01-01
  • 2023-03-08
  • 2011-10-16
  • 2012-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多