Загрузка документа в OpenOffice с использованием внешней программы Python
Я пытаюсь создать программу на 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 ответа
Это похоже на проблему 90701: http://www.openoffice.org/issues/show_bug.cgi?id=90701
Смотрите также http://piiis.blogspot.com/2008/10/pyuno-broken-in-ooo-30-with-system.html и http://udk.openoffice.org/python/python-bridge.html
Прошло много времени с тех пор, как я что-то делал с PyUNO, но, глядя на код, который работал в прошлый раз, я запустил его в 2006 году, я сделал свой загрузочный документ так:
def urlify(path):
return uno.systemPathToFileUrl(os.path.realpath(path))
desktop.loadComponentFromURL(
urlify(tempfilename), "_blank", 0, ())
Ваш пример является упрощенной версией, и я не уверен, что вы удалили лишние аргументы намеренно или не намеренно.
Если loadComponentFromURL отсутствует, значит, API изменился или что-то еще не так, я прочитал ваш код и похоже, что вы делаете все то же самое, что и я.
Я не верю, что dir() методов объекта desktop будет полезен, так как я думаю, что есть __getattr__
метод используется для прокси через запросы, и все методы, которые вы распечатали, являются служебными методами, используемыми для объекта stand-in для com.sun.star.frame.Desktop
,
Я думаю, что, возможно, сбой может заключаться в том, что нет метода с именем loadComponentFromURL, который имеет ровно 1 аргумент. Возможно, предоставление версии с четырьмя аргументами приведет к тому, что метод будет найден и использован. Это может быть просто несоответствие импеданса между Python и Java, где Java перегружает метод подписи вызова.