如何解决创建一个新的Excel应用程序实例,并使用PyWin32的win32com模块确保缓存
在Python中,要使用PyWin32软件包创建新的Excel Application实例,请使用
win32com.client
模块中的DispatchEx
函数:
excel_application = win32com.client.DispatchEx(clsid='Excel.Application')
为了确保在gen_py
文件夹中创建%temp%
缓存包装对象,我使用了win32com.client.gencache
模块中的EnsureDispatch
函数:
win32com.client.gencache.EnsureDispatch(prog_id='Excel.Application')
这样做时,它将返回Excel Application实例的调度,如果没有打开实例,则会创建该调度。
起初,我按以下顺序编写代码:
win32com.client.gencache.EnsureDispatch(prog_id='Excel.Application')
excel_application = win32com.client.DispatchEx(clsid='Excel.Application')
但是后来我注意到,如果尚未打开任何实例,它将创建2个实例,因此我进行了搜索,仅发现了this solution:
def create_new_excel_instance_and_ensure_cache():
import pythoncom
import win32com.client
class_identifier = 'Excel.Application'
dispatch = pythoncom.CoCreateInstanceEx(class_identifier,None,pythoncom.CLSCTX_SERVER,(pythoncom.IID_IDispatch,))[0]
if win32com.client.gencache.is_readonly:
win32com.client.gencache.is_readonly = False
win32com.client.gencache.Rebuild()
return win32com.client.gencache.EnsureDispatch(prog_id=dispatch)
我不确定if
检查是否必要,因为如果没有检查它似乎可以工作。有explanation说,第一次运行它时,在创建缓存时会生成导入异常,因为导入win32com.client.__init__()
模块时未调用win32com.client
,但是我不这样做即使删除缓存文件夹并尝试也看不到这种情况。如果不需要它,我希望将其删除,因为在阅读代码时会引起混乱。
我的猜测是此后该问题已得到解决,但我不确定。
我想到的另一种可能的解决方案是,我可以像这样切换顺序:
excel_application = win32com.client.DispatchEx(clsid='Excel.Application')
win32com.client.gencache.EnsureDispatch(prog_id='Excel.Application')
首先创建一个实例,使EnsureDispatch
不再创建一个实例。由于我只需要缓存,例如访问常量:
workbook = excel_application.Workbooks.Add(Template=win32com.client.constants.xlWBATWorksheet)
尽管我不确定该解决方案是否存在任何边缘情况。
我应该使用哪种解决方案?是否需要if
检查?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。