6

我正在尝试创建一个 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. 如果我做 a 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)。我尝试使用此处所述的解决方法,但它们似乎不起作用。

有任何想法吗?

4

2 回答 2

4

自从我对 PyUNO 做任何事情以来已经有很长一段时间了,但是查看上次我在 06 年运行它的代码,我的加载文档是这样的:

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

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

您的示例是一个简化版本,我不确定您是否有意或无意删除了额外的参数。

如果 loadComponentFromURL 不存在,那么 API 已更改或有其他问题,我已经阅读了您的代码,看起来您正在做所有与我相同的事情。

我不相信桌面对象上的方法的 dir() 会有用,因为我认为有一种__getattr__方法用于代理请求,并且您打印的所有方法都是用于的替代对象com.sun.star.frame.Desktop

我认为失败可能是没有名为 loadComponentFromURL 的方法恰好有 1 个参数。也许给出 4 个参数版本将导致找到并使用该方法。这可能只是 Python 和 Java 之间的阻抗不匹配,其中 Java 具有调用签名方法重载。

于 2010-02-02T01:15:41.667 回答