使用Python访问MS Word 2010时出现问题

时间:2013-08-14 07:55:08

标签: python ms-word pywin32

我在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文件并在其中提取数据而无需完成所有这些操作?

2 个答案:

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