2013-08-14 4 views
1

Я использую Python с Eclipse. Мне нужно получить доступ к файлу MS Word с помощью Python. Я видел несколько примеров, и я уже установил pywin32. Я пробовал некоторые из примеров, но я получаю некоторые ошибки.Проблемы с доступом к MS Word 2010 с Python

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 и извлечения данных в нем, не проходя через все это?

+0

Рассмотрите: https://github.com/mikemaccana/python-docx – Torxed

+0

@Torxed - Будет ли он работать для версии MS Word 2010. Я более чем готов рассмотреть любой вариант на данный момент. – Cryssie

+0

До тех пор, пока документ сохраняется как '* .docx', а не старый формат' * .doc'. Проверьте мой ответ ниже и проверьте значение ключа реестра для Word, и при необходимости можете подключиться к Word. – Torxed

ответ

1

win32 api для вызова системы api's является отличным, и все это, но это сложная задача. Если вы открыты для этой идеи, и вы знаете, что будете получать доступ к новому формату документа по окнам (на основе XML), то есть .docx, я бы предложил использовать собственный модуль, например python-docx.

Нет причин для использования модуля pyWin32, если вы не собираетесь выполнять некоторые конкретные задачи.

Там также альтернативы для Excel, такие как openpyxl

Как к исходной задаче, я предполагаю, что Word вы подключаете против действительности не Microsft Word 2013, а неизвестный или отсутствует приложение.

Цитата Link (Это описывает Youre вопрос и подтверждает мое предположение, что Word.Application не является на самом деле приложение)

Вы пытаетесь использовать ProgID, который не существует. «ProgID» - это действительно просто сопоставление с его CLSID. Похоже, что ваш объект не правильно регистрируется.

Посмотрите в реестре - все объекты COM имеют свое имя под HKEY_CLASSES_ROOT. Под этим именем вы найдете CLSID. Этот CLSID будет иметь ключ под HKEY_CLASSES_ROOT \ CLSID. Посмотрите на реестр , чтобы подтвердить, что имена, которые вы пробовали, не существуют как COM объектов.

В противном случае, попробуйте использовать CLSID объекта непосредственно, вместо ProgID - просто передать строку IID непосредственно Dispatch()

Я проверил реестр под HKEY_CLASSES_ROOT\CLSID\ и искали слова, стоя на том, что Ключ (папка). Я получил:

Ключ: {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.... (я думаю).

Аккуратные ленивые мужчины обходного Video tutorial here:

+0

Я пытаюсь открыть файл Word в python, чтобы извлечь некоторые данные. Я бы не возражал, если бы я мог преобразовать файл .docx во что-нибудь, что может управлять python, пока я могу получить дату из файла. – Cryssie

+0

Python может манипулировать docx с помощью данного модуля i, связанного в самом начале. – Torxed

+0

@ Cryssie Btw, если вы готовы открыть и преобразовать документ (Против всей логики или программирования ...), вы можете просто передать его в текстовый документ (* .txt)? – Torxed

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 не работало для меня. (Теперь ясно, что объекты приложения и Word предназначены для разных целей.) Вместо этого я также нашел Word.Application, Word.Application.8 и Word.Application.14 в моем реестре и просто попробовал Word.Application. 8, и он работал, как ожидалось.