Удаленное управление или сценарий Open Office для редактирования документа Word из Python

Я хочу (предпочтительно в Windows) запустить Open Office для определенного документа, найти фиксированную строку и заменить ее другой строкой, выбранной моей программой.

Как мне это сделать из внешней программы Python? ОЛЕ-что-то? Нативное решение для сценариев Python?

(Документ в формате Word 97-2003, но это, наверное, не актуально?)


person Prof. Falken    schedule 16.10.2011    source источник


Ответы (1)


Я бы сказал, используя мост Python-UNO. Это работает для вас?

import uno

ctx = uno.getComponentContext()
service_manager = ctx.getServiceManager() 
desktop = service_manager.createInstanceWithContext("com.sun.star.frame.Desktop", ctx)
document = desktop.loadComponentFromURL("file:///file.doc", "_blank", 0, ())

replace_desc = document.createReplaceDescriptor() 
replace_desc.setSearchString("text_to_replace") 

find_iter = document.findFirst(replace_desc)
while find_iter:
    find_iter.String = "replacement_text"
    find_iter = document.findNext(find_iter.End, replace_desc)

Дополнительные сведения о поиск. Также убедитесь, что OpenOffice запущен со следующей командной строкой: swriter "-accept=socket,host=localhost,port=2002;urp;".

person jro    schedule 16.10.2011
comment
Возможно глупый вопрос, но когда Python говорит ImportError: no module uno, что я делаю не так? У меня установлен стандартный Windows 2.7.2 Python. - person Prof. Falken; 16.10.2011
comment
Это необязательный устанавливаемый компонент для OpenOffice. Подробнее об установке см. на странице Введение в Python на OOo в Wiki OpenOffice. - person jro; 16.10.2011
comment
Теперь он работает, но Python дает сбой: AppName: python.exe AppVer: 0.0.0.0 ModName: vclmi.dll ModVer: 3.4.302.500 Offset: 0000f13a - person Prof. Falken; 16.10.2011
comment
Используете ли вы версию Python, поставляемую с вашей установкой OpenOffice? Вы можете найти его в Program Files\OpenOffice3.x\program\python.exe. - person jro; 16.10.2011
comment
Я делаю (сначала не делал, но обнаружил, что это обычное дело) - person Prof. Falken; 16.10.2011
comment
Я немного сомневаюсь, что авария связана с этим. Поскольку стека вызовов нет, не могли бы вы попробовать выполнить его построчно, чтобы увидеть, когда он вылетит? Кажется, здесь все работает... - person jro; 16.10.2011
comment
desktop = service_manager.createInstanceWithContext(com.sun.star.frame.Desktop, ctx) ‹-- СБОЙ НА ЭТОЙ ЛИНИИ - person Prof. Falken; 17.10.2011
comment
Я также попробую с OpenOffice вместо LibreOffice. - person Prof. Falken; 17.10.2011
comment
Также вылетает на одной линии с OpenOffice - person Prof. Falken; 17.10.2011
comment
Странно... не могли бы вы попробовать запустить пример с самого сайта OpenOffice? Вы можете найти его здесь, попробуйте запустить его под заголовком Hello World . Я бы сказал, что должен работать без проблем. Позаботьтесь об использовании самого верхнего сценария (на этой странице есть больше примеров Hello world). - person jro; 17.10.2011
comment
О да :). Вы должны запустить его с soffice "-accept=socket,host=localhost,port=2002;urp;"... который у меня был по умолчанию. Я добавил это к ответу. - person jro; 17.10.2011
comment
Теперь у меня проблема: какой бы URL-адрес для загрузки я ни использовал, он говорит, что URL-адрес недействителен. Я могу изменить документы, которые уже были открыты, хотя... а, нашел! Вам нужно три слэша в файле:/// url. Спасибо! - person Prof. Falken; 17.10.2011