使用pywin32,Dispatch和DispatchEx有什么区别?

时间:2013-09-06 02:28:26

标签: python excel pywin32

打开时,例如使用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可能用于远程访问。

当我只是尝试在自己的电脑上自动化电子表格时,我使用哪种方法会有什么不同?

3 个答案:

答案 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