我在Eclipse中使用Python。我需要用Python访问MS Word文件。我已经看到了一些这方面的例子,我已经安装了pywin32。我尝试了一些例子,但是我遇到了一些错误。
import win32com.client as win32
word = win32.Dispatch("Word.Application")
word.Visible = 0
word.Documents.Open("myfile.docx")
doc = word.ActiveDocument
print doc.Content.Text
word.Quit()
这是我得到的错误。如果有人能告诉我这里做错了,那就太好了。
Traceback (most recent call last):
File "C:\Users\dino\Desktop\Python27\Test\src\AccessWordDoc.py", line 10, in <module>
word = win32.Dispatch("Word.Application")
File "C:\Python27\lib\site-packages\win32com\client\__init__.py", line 95, in Dispatch
dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,clsctx)
File "C:\Python27\lib\site-packages\win32com\client\dynamic.py", line 114, in _GetGoodDispatchAndUserName
return (_GetGoodDispatch(IDispatch, clsctx), userName)
File "C:\Python27\lib\site-packages\win32com\client\dynamic.py", line 91, in _GetGoodDispatch
IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch)
pywintypes.com_error: (-2147221005, 'Invalid class string', None, None)
是否有其他方法可以访问MS word文件并在其中提取数据而无需完成所有这些操作?
答案 0 :(得分:2)
下面的代码对我有用,这只是对#34; Word.Application&#34;的简单修改。 to&#34; Word.Application.8&#34;:
import win32com.client as win32
word = win32.Dispatch("Word.Application.8")
word.Visible = 0
word.Documents.Open("myfile.docx")
doc = word.ActiveDocument
print doc.Content.Text
word.Quit()
我在@ Torxed建议检查注册表之后找到了这个解决方案。当我尝试使用Word.Document.8时,可用的方法集不包括.Visible,.Quit和.Open,因此@ Torxed的解决方案对我不起作用。 (现在很清楚,Application和Word对象的用途不同。)相反,我在我的注册表中找到了Word.Application,Word.Application.8和Word.Application.14,并尝试了Word.Application。 8它按预期工作。
答案 1 :(得分:1)
用于调用系统api的win32 api很棒,除了它以外都是一件苦差事。
如果你对这个想法持开放态度并且你知道你将通过windows(基于XML)访问更新的文档格式,那就是.docx
我建议使用python-docx之类的本机模块
没有理由使用pyWin32模块,除非你要去做一些非常具体的任务。
还有Excel的替代品,例如openpyxl
至于你原来的问题,我猜你正在挂钩的Word
实际上不是Microsft Word 2013
,而是一个未知或缺少的应用程序。
引用Link(这描述了您的问题,并验证了我的猜测Word.Application
实际上并不是一个应用程序)
您正在尝试使用不存在的ProgID。 “ProgID”是 实际上只是它的CLSID的映射。听起来你的对象不是 正确注册。
查看注册表 - 所有COM对象的名称都直接在其下 HKEY_CLASSES_ROOT。在该名称下,您将找到CLSID。这个 然后CLSID将在HKEY_CLASSES_ROOT \ CLSID下有一个键。看着那(这 注册表以确认您尝试的名称不作为COM存在 对象。
否则,请尝试直接使用对象的CLSID,而不是 ProgID - 只需将IID字符串直接传递给Dispatch()
我在HKEY_CLASSES_ROOT\CLSID\
下检查了我的注册表,并搜索了Word上的Word(文件夹)。我得到了:
键:{00020-0000-0000-0000-00000-0000}
标题为:Microsoft Word Document
使用名为ProgID
的子文件夹,其值为:Word.Document.8
哪个让我做:
import win32com.client as win32
word = win32.Dispatch("Word.Document.8")
word.Visible = 0
word.Documents.Open("myfile.docx")
doc = word.ActiveDocument
print doc.Content.Text
word.Quit()
现在,这是Word的旧版本,因为我没有Word 2013,甚至没有像2010年那样花哨的东西:)或者我可以输入KEY 00020-000....
(我认为)。< / p>
一个整洁的懒人解决方法Video tutorial here: