打开时,例如使用pywin32的电子表格,我找到了两个选项:
excel1 = win32com.client.DispatchEx('Excel.Application')
wb = excel1.Workbooks.Open('myxls.xls')
或者我可以做
excel2 = win32com.client.Dispatch('Excel.Application')
wb = excel2.Workbooks.Open('myxls.xls')
我想知道这是否有所不同。文档字符串对我没有多大帮助:
>>> w32.Dispatch.__doc__
'Creates a Dispatch based COM object.\n '
>>> w32.DispatchEx.__doc__
'Creates a Dispatch based COM object on a specific machine.\n '
在this网站中,他们建议DispatchEx
可能用于远程访问。
当我只是尝试在自己的电脑上自动化电子表格时,我使用哪种方法会有什么不同?
答案 0 :(得分:11)
这取决于你想要什么。如果Excel已打开,则使用dispatch将在打开的Excel实例中创建新选项卡。如果Excel已经打开,则使用dispatchEx将打开一个新的Excel实例。
答案 1 :(得分:3)
DispatchEx
没有记录,Dispatch
已经暗示了实际的答案:只要使用Dispatch
,除非你有充分的理由相信你有特殊情况。
但是,如果你想知道封面的差异:
从the pywin32 source,您可以看到DispatchEx
尝试返回已完成的IDispatchEx
界面而不是IDispatch
。 (考虑到名字,这并不太令人惊讶。)
您可以在MSDN上查找IDispatchEx
,然后您会看到它是
IDispatch接口的扩展,支持适用于脚本语言等动态语言的功能。
这个想法是,如果你自动化的东西是一个动态对象(就像你在Python或Javascript中那样的对象),而不是一个静态对象(就像你在C ++或Java中那样的对象) ),Visual Basic代码可以访问其动态性质 - 在运行时枚举,添加和删除成员等。
当然pywin32几乎可以完成VB所能做到的一切,有时你需要更加明确一些。在这种情况下,您需要创建DispatchEx
,并调用其DeleteMemberByName
等方法。
答案 2 :(得分:1)
如果您正在使用COM进行自动化,比如Excel,那么您需要.Dispatch来启动应用程序的新实例,而不是干扰已经在桌面上运行的实例。
使用DispatchEx而不是Dispatch