我正在尝试创建一个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']
我已经读过有一个bug在做同样的事情,但在OpenOffice 3.0上(我在Red Hat5.3上使用的是OpenOffice 3.1)。我尝试使用here所述的解决方法,但它们似乎没有起作用。
有什么想法吗?
答案 0 :(得分: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具有调用签名方法重载。
答案 1 :(得分:2)