如何强制python(使用win32com)创建一个新的excel实例?

Posted

技术标签:

【中文标题】如何强制python(使用win32com)创建一个新的excel实例?【英文标题】:How can I force python(using win32com) to create a new instance of excel? 【发布时间】:2011-07-15 16:18:28 【问题描述】:

我正在自动化一些需要很长时间的 Excel 相关任务。

我正在使用以下方法创建一个 excel 实例:

excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Add()

但是,在脚本开始运行后,如果我选择一个打开的 Excel 工作簿(不是 Python 正在处理的那个),Python 脚本就会崩溃。但是,如果我打开一个新的 Excel 工作簿并在其中输入内容,则 python 脚本不受影响。

有没有一种特殊的方法可以调用 excel 来防止这种情况发生?还是其他解决方案?

编辑:这似乎有效。

excel = win32.DispatchEx('Excel.Application')

【问题讨论】:

如果您还提及您使用的版本以防万一,那也没什么坏处。 那么问题的情况如何?你找到答案了吗?请告诉我们。 是的,我确实找到了解决方案,请参阅编辑。 @jck 您应该将此作为答案发布,而不是在问题中进行编辑 【参考方案1】:

这是一种创建新实例的方法使用静态缓存(速度更快,并且可以使用 kwargs):

import sys
import shutil
import pythoncom
from win32com.client import gencache

def EnsureDispatchEx(clsid, new_instance=True):
    """Create a new COM instance and ensure cache is built,
       unset read-only gencache flag"""
    if new_instance:
        clsid = pythoncom.CoCreateInstanceEx(clsid, None, pythoncom.CLSCTX_SERVER,
                                             None, (pythoncom.IID_IDispatch,))[0]
    if gencache.is_readonly:
        #fix for "freezed" app: py2exe.org/index.cgi/UsingEnsureDispatch
        gencache.is_readonly = False
        gencache.Rebuild()
    try:
        return gencache.EnsureDispatch(clsid)
    except (KeyError, AttributeError):  # no attribute 'CLSIDToClassMap'
        # something went wrong, reset cache
        shutil.rmtree(gencache.GetGeneratePath())
        for i in [i for i in sys.modules if i.startswith("win32com.gen_py.")]:
            del sys.modules[i]
        return gencache.EnsureDispatch(clsid)

wdApp = EnsureDispatchEx("Word.Application")

更新:改进的版本在出错时重置缓存

【讨论】:

【参考方案2】:

你为什么不这样做呢?

from win32com import client
excel=client.Dispatch("Excel.Application")

【讨论】:

如果您不运行 make.py 来生成“静态 com 代理”,则需要 EnsureDispatch 才能访问 win32com.constants。看这个链接:timgolden.me.uk/python/win32_how_do_i/…另外,Dispatch没有解决他的问题,解决办法是DispatchEx() 如果一个 Excel 进程已经以同一个用户的身份运行,这不会启动一个新的 Excel 进程。见***.com/questions/52571993/…

以上是关于如何强制python(使用win32com)创建一个新的excel实例?的主要内容,如果未能解决你的问题,请参考以下文章

使用 win32api keybd_event 选择文本

Python学习笔记(四十三)virtualenv (创建一套“隔离”的Python运行环境)

Python - Win32Com - 如何从 Excel 电子表格单元格中提取超链接?

如何创建一组复仇者联盟图标

VC++ win32 application里如何建一个子窗口

Python使用win32com创建Access数据库