如何强制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实例?的主要内容,如果未能解决你的问题,请参考以下文章
Python学习笔记(四十三)virtualenv (创建一套“隔离”的Python运行环境)
Python - Win32Com - 如何从 Excel 电子表格单元格中提取超链接?