1

Ich habe verifiziert, dass ich sowohl normale Office - als auch Python - Makros aus dem Büro ausführen kann, aber ich habe noch nicht herausgefunden, wie man einen ausführt die Hallo Welt eins) von der Kommandozeile.libreoffice - run (python) Makro zum Einfügen eines Querverweises von der Gnu/Linux Kommandozeile

Ich habe bei anderen Antworten hier gegoogelt und gesucht, aber ich bin immer noch nicht ganz klar, wie ein offenes Büro Makro von der Kommandozeile ausgeführt werden:

https://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=8232 schlägt vor, zu verwenden:

office writer.odt "macro://Standard.Module1.Macro1()"

ich habe auch gesehen:

office "macro://Standard.Module1.Macro1()" writer.odt

In jedem Fall öffnet dies das Dokument und führt weder ein Makro aus noch meldet es einen Fehler.

Während How to call an existing LibreOffice python macro from a python script schlägt vor, Büro auf einem Hafen zu hören hören und über das kommunizieren.

Wenn ich so weit kommen muss ich noch API-Dokumentation finden, die erklären, wie man einen Anker einzufügen (wie pro meine andere Frage asciidoc: is there a way to create an anchor that will be visible in libreoffice writer?)

I RHEL7 bin mit für Kontext.

Update

oowriter "foo.odt" macro:///Standard.Module1.addXref

arbeitet mit einem Büro-Makro. Ich habe immer noch nicht den Python herausgefunden.

Ein Problem ist, dass ich keine Debug-Informationen finden kann. Gibt es irgendwo Logdateien?

Ein anderes Problem ist, welche Version von Python verwendet werden soll. Das RHEL-Paket installiert Site-Pakete für Python 2.7.

 
>rpm -q --whatprovides /usr/bin/writer 
libreoffice-writer-4.3.7.2-5.el7_2.1.x86_64 

>rpm -ql libreoffice-pyuno-4.3.7.2-5.el7_2.1 
... 
/usr/lib64/python2.7/site-packages/uno.py 

Libreoffice5.1 enthält 3.5 mit dem Distro:

>/opt/libreoffice5.1/program/python --version Python 3.5.0

So beginnt mit mir für ein Hallo Welt Python Beispiel suche, dass Paare eine bekannte Version von Python mit einer bekannten Version Büro. Vorzugsweise einer der beiden oben (Writer 4.3.7 & Python 2.7? Oder Writer 5.1 & Python 3.5).

update2

Mit python3.5 als mit office5 installiert.1 Ich habe eine Arbeits Hallo Welt mit dem folgenden:

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) 

# access the current writer document 
model = desktop.getCurrentComponent() 

# access the document's text property 
text = model.Text 

# create a cursor 
cursor = text.createTextCursor() 

# insert the text into the document 
text.insertString(cursor, "Hello World", 0) 

Dies funktioniert mit jeder Version von Open Office über:

/usr/bin/oowriter --accept="socket,host=localhost,port=2002;urp;StarOffice.ServiceManager"

So ist der letzte Teil ist den Querverweis hinzuzufügen.

Antwort

0

Es sieht so aus, als ob der Befehl einen zusätzlichen Schrägstrich benötigt. Dieser arbeitete für mich auf Ubuntu:

lowriter "Untitled 1.odt" macro:///Standard.Module1.SayHello 

, dass diese Methode in dem Modul Module1 unter My Macros & Dialogs/Standard Namen nennt:

Sub SayHello 
    MsgBox("Hello, World!") 
End Sub 

Der obige Ansatz funktioniert nur für Basic-Makros. Bei Python-Makros besteht die Standardmethode für die Befehlszeile darin, eine Verbindung zu einer abhörenden Instanz von Office herzustellen. Warnung: Dies ist viel (vielleicht 10x) langsamer als die Ausführung in Office.

Der von Ihnen vorgeschlagene Link zeigt, wie ein Python-Makro von einem anderen Python-Skript aufgerufen wird, das komplexer ist als das, was wir hier benötigen. Setzen Sie stattdessen den Verbindungscode (beginnend mit localContext = uno.getComponentContext()) und den Makrocode in dasselbe Skript. Ein Beispiel für das, was in das Skript geschrieben werden sollte, finden Sie unter "Erste Schritte mit der Python-Shell, um vertraut zu werden" unter http://christopher5106.github.io/office/2015/12/06/openoffice-libreoffice-automate-your-office-tasks-with-python-macros.html.

Soweit Anker zu schaffen, gibt es eine Reihe von verschiedenen Objekten in Libreoffice, die als Anker dienen können:

Diese Liste wurde von How do I check for broken internal links in Star Basic? kopiert. In Ihrer anderen Frage haben Sie auch nach defekten Links gefragt, also ist diese Frage hoffentlich hilfreich.

Eine Möglichkeit, einen Hyperlink zu erstellen, besteht darin, die Eigenschaft HyperLinkURL eines Textes zu bearbeiten. Angenommen, es gibt ein Lesezeichen mit der Bezeichnung MyBookmark. Dann wird der folgende Code den aktuell ausgewählten Text in einen Hyperlink ändert:

viewcursor = currentController.getViewCursor() 
viewcursor.HyperLinkURL = "#MyBookmark" 

EDIT:

In Bezug auf welche Version von Python zu verwenden, die derzeit verwendet Libreoffice Python 3 und Openoffice verwendet Python 2.

Zum Debuggen von Informationen können Sie einen Checkpoint in der Basic IDE setzen. Für Python verwende ich die logging module. OpenOffice hat auch verschiedene Protokolldateien, aber normalerweise finde ich sie nicht hilfreich.

In Bezug auf Probleme mit Python, haben Sie versucht, den Link, den ich gepostet habe? Wenn ja, wie weit bist du gekommen?

Ich glaube nicht, dass Sie viele RHEL Beispiele finden werden.Versuchen Sie, es zuerst auf einer Desktop-Distribution wie Ubuntu zum Laufen zu bringen, und passen Sie dann diesen Ansatz RHEL an.

+0

oowriter "foo.odt" Makro: ///Standard.Module1.addXref arbeitet mit einem Office-Basismakro. –

+0

Das 'coool'-Skript, mit dem verlinkt wird (http://stackoverflow.com/questions/37611030/how-do-i-check-for-broken-internal-links-in-star-basic), ist interessant, tut es aber nicht Geben Sie an, welche Version von Python verwendet werden soll. Es ist nicht 2.7.5 und nicht 3.x –

+0

Um das 'coool'-Skript zum Laufen zu bringen, habe ich den Code heruntergeladen, das' configparse'-Zeug auskommentiert und für die Verwendung von Python 3-Bibliotheken aktualisiert. Es hat ungefähr eine Stunde gedauert. –