我有一个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 就可以了 . 您可以看到命令启动的二进制文件的路径,例如 . 过程探索者 .
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 调用创建的唯一对象 .
Excel.Application.14
LocalServer
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{00024500-0000-0000-C000-000000000046}\LocalServer
Dispatch
所有这些都解释为here(§"Using Automation to Control Microsoft Excel") .
正如我所说,这个 LocalServer 指向最后安装的版本 . 因此,您有机会实现您想要的目标:
要么您有信心手动更改注册表 . 我会说"easy"(更改 LocalServer 指向的应用程序,以及 Excel.Application 条目的默认应用程序),但我更喜欢以下简单的解决方案
Excel.Application
重新安装2007应用程序(当然,如果可以的话) . 这是一个糟糕/不优雅但简单的修复 .
以下应该可以工作,因为我测试了它,虽然没有同时安装两个版本的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 后 EXCEL.exe 你想为默认值(注意与 \\ S)使用,在 you_name_it.reg 和运行/合并/双击它 . 它会要求您确认,给予肯定和检查 .
reg
C:\\Program Files\\Microsoft Office\\Office14\\EXCEL.EXE
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 加载模块?用法是:
EnsureModule
from win32com.client import gencache mod = gencache.EnsureModule('clsID', 'lcID','versionMajor', 'versionMinor')
并且您可以从 lib/site-packages/win32com/client 文件夹中的 python makepy.py -i 中检索所需的所有内容它将打开一个窗口,您可以在其中选择所需的应用程序 . 你会在那里找到两个Excell版本,选择所需的版本,它将返回如何将它连接到python .
lib/site-packages/win32com/client
python makepy.py -i
从这里您将有两个选择 .1) excel = mod.Application 应该为您提供应用程序调度,但您可能无法看到它的属性(但版本应该是正确的,命令应该照常工作) .
excel = mod.Application
2) excel = win32com.client.Dispatch("Excel.Application") 应该使用你刚刚生成的模块(但我不确定这是否会起作用并带来正确的版本!) .
excel = win32com.client.Dispatch("Excel.Application")
4 回答
对于Excel 2013,您可以键入:
因为该程序位于以下某处:
由于我没有安装任何其他版本,我想如果您只需用您需要的版本替换
15
就可以了 . 您可以看到命令启动的二进制文件的路径,例如 . 过程探索者 .编辑:这不可能“以编程方式”:(
尝试过这个之后:
产生这样的对象:
在进程资源管理器中只能看到一个Excel(14)实例 . 干
证实了这一点 .
事实证明,使用自动化来控制两个版本的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(§"Using Automation to Control Microsoft Excel") .
有希望
正如我所说,这个
LocalServer
指向最后安装的版本 . 因此,您有机会实现您想要的目标:要么您有信心手动更改注册表 . 我会说"easy"(更改
LocalServer
指向的应用程序,以及Excel.Application
条目的默认应用程序),但我更喜欢以下简单的解决方案重新安装2007应用程序(当然,如果可以的话) . 这是一个糟糕/不优雅但简单的修复 .
以下应该可以工作,因为我测试了它,虽然没有同时安装两个版本的Excel,而是强制Excel文件在Word(即WINWORD.exe)中打开 . 将路径替换为您要使用的任何版本的Excel:
保存上述
reg
脚本路径实际更换C:\\Program Files\\Microsoft Office\\Office14\\EXCEL.EXE
后EXCEL.exe
你想为默认值(注意与\\
S)使用,在you_name_it.reg
和运行/合并/双击它 . 它会要求您确认,给予肯定和检查 .我没试过这个,但也许你可以用类似的东西启动你想要的Excel版本
(或者手动启动Excel的子进程方法),然后尝试
获取正在运行的实例 .
您是否尝试通过
EnsureModule
加载模块?用法是:
并且您可以从
lib/site-packages/win32com/client
文件夹中的python makepy.py -i
中检索所需的所有内容它将打开一个窗口,您可以在其中选择所需的应用程序 . 你会在那里找到两个Excell版本,选择所需的版本,它将返回如何将它连接到python .
从这里您将有两个选择 .
1)
excel = mod.Application
应该为您提供应用程序调度,但您可能无法看到它的属性(但版本应该是正确的,命令应该照常工作) .2)
excel = win32com.client.Dispatch("Excel.Application")
应该使用你刚刚生成的模块(但我不确定这是否会起作用并带来正确的版本!) .