我有一个 excel 2007 文件(*.xlsx),将通过 python 脚本打开。但问题是我的电脑上安装了两个版本的 MS Office(2003 和 2007)。尽管我尝试将 Excel 2007 作为打开 xlsx 文件的默认应用程序,但 win32com.client 正在尝试使用 Excel 2003 打开我的 xlsx 文件。这也将 Excel 2003 恢复为默认应用程序。
有没有办法强制 win32com.client 选择 Excel 2007 打开 xlsx 文件?
对于 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。LocalServer
每个 CLSID只有一个(HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{00024500-0000-0000-C000-000000000046}\LocalServer
在我的计算机上)。此 LocalServer 指向我计算机上最后安装的版本 Excel14(试用版)。这是Dispatch
调用创建的唯一对象。
所有这些都在此处进行了解释(§“使用自动化控制 Microsoft Excel”)。
正如我所说,这LocalServer
指向最后安装的版本。因此,您有机会实现您想要的:
LocalServer
应用程序,以及Excel.Application
该条目的默认应用程序),但我更喜欢以下简单的解决方案以下应该可以工作,因为我已经对其进行了测试,尽管没有同时安装两个版本的 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
我没有尝试过,但也许你可以使用类似的东西启动你想要的 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)
获取正在运行的实例。
您是否尝试通过加载模块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")
应该使用您刚刚生成的模块(但我不确定这是否可行并带来正确的版本!)。