首页 文章

如何选择win32com.client必须在python中使用的excel版本?

提问于
浏览
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 回答

  • 3

    对于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 . 每个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应用程序(当然,如果可以的话) . 这是一个糟糕/不优雅但简单的修复 .

  • 5

    以下应该可以工作,因为我测试了它,虽然没有同时安装两个版本的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.EXEEXCEL.exe 你想为默认值(注意与 \\ S)使用,在 you_name_it.reg 和运行/合并/双击它 . 它会要求您确认,给予肯定和检查 .

  • 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)
    

    获取正在运行的实例 .

  • 0

    您是否尝试通过 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") 应该使用你刚刚生成的模块(但我不确定这是否会起作用并带来正确的版本!) .

相关问题