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

pan*_*ita 6 python excel pywin32

当打开例如pywin32的电子表格时,我发现有两个选项:

excel1 = win32com.client.DispatchEx('Excel.Application')
wb = excel1.Workbooks.Open('myxls.xls')
Run Code Online (Sandbox Code Playgroud)

或者我能做到

excel2 = win32com.client.Dispatch('Excel.Application')
wb = excel2.Workbooks.Open('myxls.xls')
Run Code Online (Sandbox Code Playgroud)

而且我想知道这是否有所作为.文档字符串对我没有多大帮助:

>>> w32.Dispatch.__doc__
'Creates a Dispatch based COM object.\n '

>>> w32.DispatchEx.__doc__
'Creates a Dispatch based COM object on a specific machine.\n  '
Run Code Online (Sandbox Code Playgroud)

这个站点中,他们建议DispatchEx可能用于远程访问.

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

小智 11

这取决于你想要什么.如果Excel已打开,则使用dispatch将在打开的Excel实例中创建新选项卡.如果Excel已打开,则使用dispatchEx将打开Excel的新实例.

  • 我正在使用 Dispatch,它无论如何都会打开一个新的 Excel 实例。为什么?我想连接到已经打开的实例。我应该怎么做? (2认同)

aba*_*ert 5

DispatchEx没有记录,并且Dispatch已经暗示了实际答案:只要使用Dispatch,除非您有充分的理由相信您有特殊情况。

但是,如果您想知道封面下的差异:

pywin32 源代码中,您可以看到它DispatchEx尝试返回一个包装好的IDispatchEx接口而不是IDispatch. (考虑到名字,这并不奇怪。)

你可以看看IDispatchExMSDN,你会看到它是

IDispatch 接口的扩展,支持适用于动态语言(例如脚本语言)的功能。

这个想法是,如果你自动化的东西是一个动态对象(比如你在 Python 或 Javascript 中拥有的那种对象),而不是一个静态对象(比如你在 C++ 或 Java 中拥有的那种对象),Visual基本代码可以访问其动态特性——在运行时枚举、添加和删除成员等。

当然,pywin32 几乎可以做 VB 可以做的所有事情,有时您只需要更明确一点。在这种情况下,您需要创建一个DispatchEx,并调用其DeleteMemberByName等方法。