创建一个新的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 (将#修改为@)