1

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

4

2 回答 2

2

下面的代码对我有用,这只是将“Word.Application”简单地更改为“Word.Application.8”:

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,它按预期工作。

于 2014-12-10T19:06:37.657 回答
1

用于调用系统 api 的 win32 api 很棒,但它是一件苦差事。如果您对这个想法持开放态度并且您知道您将通过 Windows(基于 XML)访问较新的文档格式,那么.docx我建议使用本机模块,例如python-docx

除非您要执行一些非常具体的任务,否则没有理由使用 pyWin32 模块。

Excel还有其他选择,例如openpyxl

至于您最初的问题,我猜Word您所挂钩的实际上Microsft Word 2013并不是一个未知或丢失的应用程序。

引用链接(这描述了您的问题并验证了我的猜测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。我有:

键:{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 一样的东西 :) 或者我可以输入00020-000....(我认为)的 KEY。

一个整洁的懒人解决方法视频教程在这里

于 2013-08-14T08:05:03.690 回答