问题描述
在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 (将#修改为@)