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ワードファイルにアクセスして、これをすべて行わずにデータを抽出する別の方法はありますか?

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 は素晴らしいですが、それは雑用です。あなたがそのアイデアにオープンで、(XML に基づいて) Windows で新しいドキュメント形式にアクセスすることがわかっている場合は、python-docx.docxなどのネイティブ モジュールを使用することをお勧めします。

非常に具体的なタスクを実行する場合を除き、pyWin32 モジュールを使用する理由はありません。

openpyxlなどの Excel の代替手段もあります。

Wordあなたの元の問題に関しては、あなたがフックしているのは実際にはではMicrosft Word 2013なく、不明または欠落しているアプリケーションであると推測しています。

引用リンクWord.Application(これはあなたの問題を説明し、実際にはアプリケーションではない私の推測を検証します)

存在しない ProgID を使用しようとしています。「ProgID」は、実際にはその CLSID への単なるマッピングです。オブジェクトが正しく登録されていないようです。

レジストリを調べます。すべての COM オブジェクトの名前は、HKEY_CLASSES_ROOT の直下にあります。その名前の下に CLSID があります。この CLSID は、HKEY_CLASSES_ROOT\CLSID の下にキーを持ちます。レジストリを調べて、試した名前が COM オブジェクトとして存在しないことを確認してください。

それ以外の場合は、ProgID の代わりにオブジェクトの CLSID を直接使用してみてください。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....(と思います)。

きちんとした怠け者の回避策ビデオチュートリアルはこちら:

于 2013-08-14T08:05:03.690 に答える