Загрузка документа в OpenOffice с использованием внешней программы Python - PullRequest
6 голосов
/ 28 января 2010

Я пытаюсь создать программу на Python (используя pyUNO), чтобы внести некоторые изменения в таблицу калькуляции OpenOffice.

Ранее я запускал OpenOffice в режиме «принять», чтобы иметь возможность подключаться из внешней программы. Видимо, должно быть так же просто, как:

import uno
# get the uno component context from the PyUNO runtime
localContext = uno.getComponentContext()

# create the UnoUrlResolver
resolver = localContext.ServiceManager.createInstanceWithContext(
                            "com.sun.star.bridge.UnoUrlResolver", localContext)

# connect to the running office
ctx = resolver.resolve("uno:socket,host=localhost,port=2002;"
                       "urp;StarOffice.ComponentContext")
smgr = ctx.ServiceManager

# get the central desktop object
DESKTOP =smgr.createInstanceWithContext("com.sun.star.frame.Desktop", ctx)

#The calling it's not exactly this way, just to simplify the code
DESKTOP.loadComponentFromURL('file.ods') 

Но я получаю AttributeError, когда пытаюсь получить доступ к loadComponentFromURL. Если я сделаю dir(DESKTOP), я увижу только следующие атрибуты / методы:

['ActiveFrame', 'DispatchRecorderSupplier', 'ImplementationId', 'ImplementationName',
'IsPlugged', 'PropertySetInfo', 'SupportedServiceNames', 'SuspendQuickstartVeto', 
'Title', 'Types', 'addEventListener', 'addPropertyChangeListener', 
'addVetoableChangeListener', 'dispose', 'disposing', 'getImplementationId', 
'getImplementationName', 'getPropertySetInfo', 'getPropertyValue', 
'getSupportedServiceNames', 'getTypes', 'handle', 'queryInterface', 
'removeEventListener', 'removePropertyChangeListener', 'removeVetoableChangeListener', 
'setPropertyValue', 'supportsService']

Я читал, что есть ошибки, которые делают то же самое, но в OpenOffice 3.0 (я использую OpenOffice 3.1 поверх Red Hat5.3). Я попытался использовать обходной путь, указанный здесь , но, похоже, они не работают.

Есть идеи?

Ответы [ 2 ]

4 голосов
/ 02 февраля 2010

Прошло много времени с тех пор, как я что-то делал с PyUNO, но, глядя на код, который работал в прошлый раз, когда я запускал его в '06, я загрузил свой документ так:

def urlify(path):
     return uno.systemPathToFileUrl(os.path.realpath(path))

desktop.loadComponentFromURL(
        urlify(tempfilename), "_blank", 0, ())

Ваш пример является упрощенной версией, и я не уверен, что вы удалили лишние аргументы намеренно или не намеренно.

Если loadComponentFromURL отсутствует, значит, API изменился или что-то еще не так, я прочитал ваш код и похоже, что вы делаете все то же самое, что и я.

Я не верю, что метод dir () объекта desktop будет полезен, так как я думаю, что для прокси через запросы используется метод __getattr__ и все методы, которые вы распечатали являются служебными методами, используемыми для резервного объекта для com.sun.star.frame.Desktop.

Я думаю, что, возможно, ошибка может заключаться в том, что нет метода с именем loadComponentFromURL, который имеет ровно 1 аргумент. Возможно, предоставление версии с четырьмя аргументами приведет к тому, что метод будет найден и использован. Это может быть просто несоответствие импеданса между Python и Java, где Java перегружает метод подписи вызова.

2 голосов
/ 04 марта 2010
...