使用外部Python程序在OpenOffice上加载文档

使用外部Python程序在OpenOffice上加载文档,python,pyuno,Python,Pyuno,我正在尝试创建一个python程序(使用pyUNO)来对OpenOffice计算表进行一些更改 我以前在“接受”模式下启动了OpenOffice,以便能够从外部程序进行连接。显然,这应该很容易: import uno # get the uno component context from the PyUNO runtime localContext = uno.getComponentContext() # create the UnoUrlResolver resolver = local

我正在尝试创建一个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') 
但是当我尝试访问
loadComponentFromURL
时,我得到了一个
AttributeError
。如果我制作一个
目录(桌面)
,我只看到以下属性/方法:

['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']
我已经读到有一个bug在做同样的事情,但是在OpenOffice 3.0上(我使用的是OpenOffice 3.1而不是Red Hat 5.3)。我已经尝试使用所述的变通方法,但它们似乎不起作用


有什么想法吗?

我已经很久没有用PyUNO做过任何事情了,但是看看上次我在06年运行它时的代码,我的加载文档是这样做的:

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

desktop.loadComponentFromURL(
        urlify(tempfilename), "_blank", 0, ())
您的示例是一个简化版本,我不确定您是否有意删除了额外的参数

如果loadComponentFromURL不存在,那么API已经更改或者出现了其他错误,我已经通读了您的代码,看起来您正在做与我相同的事情

我不相信桌面对象上方法的dir()会有用,因为我认为有一个
\uuuu getattr\uuu
方法用于代理请求,并且您打印出来的所有方法都是用于
com.sun.star.frame.desktop
的替代对象的实用方法


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

这看起来像问题90701:


另请参见和

未找到该方法,因为我一直在尝试获取方法itsef,从交互式shell调用时不带参数:-(我也尝试使用四个参数调用它,我有意简化它)。