10

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

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

4

4 回答 4

6

对于 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.1415) 共享相同的 CLSID。LocalServer每个 CLSID只有一个(HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{00024500-0000-0000-C000-000000000046}\LocalServer在我的计算机上)。此 LocalServer 指向我计算机上最后安装的版本 Excel14(试用版)。这是Dispatch调用创建的唯一对象。

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

还有希望

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

  • 要么您有信心手动更改注册表。我会说“简单”(更改 指向的LocalServer应用程序,以及Excel.Application该条目的默认应用程序),但我更喜欢以下简单的解决方案
  • 重新安装 2007 应用程序(当然,如果可以的话)。这是一个糟糕/不优雅但简单的修复。
于 2013-09-13T17:53:40.993 回答
3

以下应该可以工作,因为我已经对其进行了测试,尽管没有同时安装两个版本的 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"

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

于 2013-09-14T20:03:12.397 回答
2

我没有尝试过,但也许你可以使用类似的东西启动你想要的 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) 

获取正在运行的实例。

于 2013-09-18T01:29:29.140 回答
0

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

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

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



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

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

于 2013-09-17T13:51:03.750 回答