2010-01-28 10 views
6

Ich versuche ein Python-Programm (mit pyUNO) zu erstellen, um einige Änderungen an einem OpenOffice-Berechnungsblatt vorzunehmen.Laden eines Dokuments auf OpenOffice mit einem externen Python-Programm

Ich habe zuvor OpenOffice auf "akzeptieren" -Modus gestartet, um eine Verbindung von einem externen Programm herstellen zu können. Offenbar sollte so einfach wie:

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') 

Aber ich erhalte eine AttributeError wenn ich versuche, loadComponentFromURL zuzugreifen. Wenn ich ein dir(DESKTOP) machen, habe ich sehe nur die folgenden Attribute/Methoden:

['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'] 

ich gelesen habe, dass es, wo ein Fehler das gleiche zu tun, aber auf Openoffice 3.0 (Ich bin mit Openoffice 3.1 über Red Hat5.3). Ich habe versucht, die Problemumgehung here zu verwenden, aber sie scheint nicht zu arbeiten.

Irgendwelche Ideen?

Antwort

4

Es hat eine lange Zeit her, dass ich mit PyUNO tat nichts, aber Blick auf den Code, das letzte Mal habe ich es zurück in '06 lief, habe ich meine Last Dokument wie folgt aus:

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

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

Ihre Beispiel ist eine vereinfachte Version, und ich bin mir nicht sicher, ob Sie die zusätzlichen Argumente absichtlich oder nicht absichtlich entfernt haben.

Wenn loadComponentFromURL nicht vorhanden ist, dann hat sich die API geändert oder es ist etwas anderes nicht in Ordnung, ich habe Ihren Code gelesen und es sieht so aus, als ob Sie die gleichen Dinge tun wie ich.

Ich glaube nicht, dass die dir() der Methoden auf dem Desktop-Objekt nützlich sein wird, wie ich denke, es gibt eine __getattr__ Methode Proxy verwendet durch die Anforderungen, und alle Methoden, die Sie ausgedruckt haben Utility-Methoden für das Stand-in-Objekt für die com.sun.star.frame.Desktop.

Ich denke, der Fehler könnte sein, dass es keine Methode namens loadComponentFromURL gibt, die genau 1 Argument hat. Wenn Sie die 4-Argument-Version angeben, führt dies dazu, dass die Methode gefunden und verwendet wird. Dies könnte einfach eine Impedanzfehlanpassung zwischen Python und Java sein, bei der Java eine Call-Signatur-Methode überladen hat.

+0

Die Methode nicht gefunden, wie ich die Methode ITSEF zu bekommen habe versucht, ohne Parameter aus der interaktiven Shell Aufruf: - (Ich habe auch versucht, es mit vier Parametern zu nennen, ich habe es absichtlich vereinfacht. – Khelben

Verwandte Themen