Python 从Word.Application对象获取文档对象时,当VBSEdit能够获取其成员时,不会从gencache缓存中填充其成员
完美地总结了我的问题(稍加修改以针对我的案例进行更新): 我希望有一个Word文档实例,包含所有方法和 交互会话期间可见的属性。这是我的现金网 附件:Python 从Word.Application对象获取文档对象时,当VBSEdit能够获取其成员时,不会从gencache缓存中填充其成员,python,ms-word,com,pythoncom,Python,Ms Word,Com,Pythoncom,完美地总结了我的问题(稍加修改以针对我的案例进行更新): 我希望有一个Word文档实例,包含所有方法和 交互会话期间可见的属性。这是我的现金网 附件: >>> from win32com.client import gencache, Dispatch >>> gencache.EnsureModule('{00020905-0000-0000-C000-000000000046}', 0, 8, 1, bForDemand=True) <module
>>> from win32com.client import gencache, Dispatch
>>> gencache.EnsureModule('{00020905-0000-0000-C000-000000000046}', 0, 8, 1, bForDemand=True)
<module 'win32com.gen_py.00020905-0000-0000-C000-000000000046x0x8x1' from
'C:\DOCUME~1\osuchw\LOCALS~1\Temp\gen_py\2.3\00020905-0000-0000-C000-000000000046x0x8x1\__init__.py'>
>>> word = Dispatch('Word.Application')
>>> word
<win32com.gen_py.Microsoft Word 12.0 Object Library._Application instance at 0x18074720>
>>> doc = word.Documents.Add()
>>> doc
<win32com.gen_py.None.Document>
但即使在这种情况下,它仍然是win32com.gen_py.None.Document
最奇怪的是,对象的类被识别并存在于缓存中:
>>> ad=win32com.client.gencache.EnsureDispatch("Word.Document")
>>> d = w.ActiveDocument
>>> d.__class__
<class win32com.gen_py.00020905-0000-0000-C000-000000000046x0x8x4.Document at 0x02A101B8>
>>> ad.__class__
<class win32com.gen_py.00020905-0000-0000-C000-000000000046x0x8x4._Document at 0x02A07B20>
>>> len(dir(ad.__class__))
141
>>> len(dir(d.__class__))
11
ad=win32com.client.gencache.EnsureDispatch(“Word.Document”)
>>>d=w.ActiveDocument
>>>d.。_类__
>>>广告类__
>>>len(主任(高级)
141
>>>len(主任(d.\U类)
11
同时,VBA编辑器和列表
w.ActiveDocument
的成员很好。他们是如何做到这一点的,为什么pythoncom不能做同样的事情呢?d.\u dispobj\u
拥有所有成员,因此可以使用它来代替d
眼前的问题解决了
但是我仍然不知道发生了什么。Word 2013 VBA使用
程序文件\Microsoft Office\Office15\MSWORD.OLB
和程序文件\Common Files\Microsoft Shared\Office15\MSO.DLL
。我猜前者是Document
存在的地方。@cxw没有区别python-m win32com.client.makepy“c:\Program Files\Microsoft Office\Office12\MSWORD.OLB”
生成与python-m win32com.client.makepy“Microsoft Word 12.0对象库”
.32位还是64位相同的包装器?在我的系统中,ad.CLSID
是0002096B-…
而不是00020906-…
,前者位于HKCR\Wow6432Node
下。我可以用Office 2013 32位和Python 3.4 64位重新编程。如果您的Office和Python是不同的位宽度,请尝试使用与Office相同宽度的Python,看看是否有帮助?@cxw Office和Python都是32位的。Office 2007和Python 2.7.13以及pywin32-221。
import win32com.client.selecttlb
ii=win32com.client.selecttlb.EnumTlbs()
ii=[i.desc for i in ii]
# one typelib - "Visual Basic runtime objects and procedures [6.0]" - produced an error
for i in ii: subprocess.call(['python','-m','win32com.client.makepy',i])
>>> ad=win32com.client.gencache.EnsureDispatch("Word.Document")
>>> d = w.ActiveDocument
>>> d.__class__
<class win32com.gen_py.00020905-0000-0000-C000-000000000046x0x8x4.Document at 0x02A101B8>
>>> ad.__class__
<class win32com.gen_py.00020905-0000-0000-C000-000000000046x0x8x4._Document at 0x02A07B20>
>>> len(dir(ad.__class__))
141
>>> len(dir(d.__class__))
11