
Ich möchte ein LibreOffice-Makro auf .odt-Dateien über die Befehlszeile ausführen. Da ich dies auf mehrere Dateien anwenden möchte, möchte ich nicht, dass bei jeder Ausführung des Makros die GUI angezeigt wird.
Ich habe derzeit ein funktionierendes Makro (das die Datei am Ende auch schließt) und soweit ich weiß, sollte ich es wie folgt aufrufen können:
soffice --invisible --nofirststartwizard --headless --norestore "D:\myFolder\my file.odt" "macro:///Standard.Module1.myMacro"
oder
swriter --invisible --nofirststartwizard --headless --norestore "D:\myFolder\my file.odt" "macro:///Standard.Module1.myMacro"
Beide Befehle führen das Makro korrekt aus, allerdings öffnet und schließt sich die GUI während der Ausführung. Wie verhindere ich dies?
Ich arbeite an einem Windows 10 Computer undHilfe>Über LibreOfficegab folgende Info:
Version: 5.2.1.2
Build-ID: 31dd62db80d4e60af04904455ec9c9219178d620
CPU-Threads: 4; Betriebssystemversion: Windows 6.2; UI-Rendering: Standard;
Gebietsschema: en-US (en_US); Rechner: CL
Antwort1
Das Problem ist, dass LibreOffice zwar beim Start unsichtbar ist, aber nach dem Öffnen eines Dokuments sichtbar wird. Es gibt eine Lösung unterhttps://forum.openoffice.org/en/forum/viewtopic.php?f=5&t=22548:
Führen Sie LibreOffice ohne Headless aus, um ein Makro aufzurufen. Der Befehlszeilenaufruf solltenichtGeben Sie das zu öffnende Dokument an, nur ein Makro. Beispiel (unter Verwendung der neueren Makrosyntax):
soffice -headless -invisible "vnd.sun.star.script:Standard.Module1.MySubroutine?language=Basic&location=application"
Das Makro ruftKomponente aus URL ladenmit der
Hidden
Eigenschaft auf true gesetzt. Dies führt dazu, dass das Dokument nicht sichtbar wird.Jetzt führt das Makro mit dem Dokument die gewünschte Aktion aus.
BEARBEITEN:
Damit es für verschiedene Dateien funktioniert, übergeben Sie den Dateinamen als Parameter mit der älteren Makrosyntax. Ein Beispiel aushttps://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=8232:
soffice "macro:///Library3.Module1.test_Args(arg1,123,4.567,2000-12-31)"
Antwort2
Um die bereits gute Antwort von Jim K. etwas klarer zu formulieren:
function OpenSilent(FilePath as String) as Object
Dim FileProperties(1) As New com.sun.star.beans.PropertyValue
FileProperties(0).Name = "Hidden"
FileProperties(0).Value = True
OpenSilent = StarDesktop.loadComponentFromURL("file://" & FilePath, "_blank", 0, FileProperties())
end function
sub Headless(FilePath as String)
Document = OpenSilent(FilePath)
call MyArgumentlessMacro()
call Document.close(True)
end sub
sub HeadlessWithArgs(FilePath as String, Arg1 as Variant, Arg2 as Variant)
Document = OpenSilent(FilePath)
call MyMacroWithArguments(Arg1, Arg2)
call Document.close(True)
end sub
Jetzt können wir Folgendes tun:
soffice --invisible --nofirststartwizard --headless --norestore 'macro:///MyLibrary.MyModule.Headless("/home/user/File.odt")'
# or
soffice --invisible --nofirststartwizard --headless --norestore 'macro:///MyLibrary.MyModule.Headless("/home/user/File.odt", "Hello, World", 6847)'
Es wäre viel besser, den Namen des inneren Makros übergeben zu können, das von der Soffice-Befehlszeile aus aufgerufen werden soll, also als Argument an Headless, aber das hebe ich mir für ein anderes Mal auf.