
Quiero ejecutar una macro de LibreOffice en archivos .odt desde la línea de comando. Como quiero ampliar esto para aplicar la macro a varios archivos, no quiero que la GUI aparezca en cada ejecución de la macro.
Actualmente tengo una macro en funcionamiento (que también cierra el archivo al final) y, hasta donde puedo encontrar, debería poder llamarla de la siguiente manera:
soffice --invisible --nofirststartwizard --headless --norestore "D:\myFolder\my file.odt" "macro:///Standard.Module1.myMacro"
o
swriter --invisible --nofirststartwizard --headless --norestore "D:\myFolder\my file.odt" "macro:///Standard.Module1.myMacro"
Ambos comandos ejecutan la macro correctamente; sin embargo, la GUI se abre y cierra durante la ejecución. ¿Cómo evito esto?
Estoy trabajando en una computadora con Windows 10 yAyuda>Acerca de LibreOfficedio la siguiente información:
Versión: 5.2.1.2
ID de compilación: 31dd62db80d4e60af04904455ec9c9219178d620
Subprocesos de CPU: 4; Versión del sistema operativo: Windows 6.2; Representación de interfaz de usuario: predeterminada;
Configuración regional: en-US (en_US); Cálculo: CL
Respuesta1
El problema es que aunque LibreOffice es invisible cuando se inicia, se vuelve visible después de abrir un documento. Hay una solución enhttps://forum.openoffice.org/en/forum/viewtopic.php?f=5&t=22548:
Ejecute LibreOffice sin cabeza para llamar a una macro. La llamada a la línea de comando debenoespecifique el documento para abrir, solo una macro. Por ejemplo (usando la sintaxis de macro más nueva):
soffice -headless -invisible "vnd.sun.star.script:Standard.Module1.MySubroutine?language=Basic&location=application"
La macro llamacargarComponenteDesdeUrlcon la
Hidden
propiedad establecida en verdadero. Esto hará que el documento no se vuelva visible.Ahora la macro realiza lo que iba a hacer con el documento.
EDITAR:
Para que funcione para diferentes archivos, pase el nombre del archivo como parámetro utilizando la sintaxis de macro anterior. Un ejemplo dehttps://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=8232:
soffice "macro:///Library3.Module1.test_Args(arg1,123,4.567,2000-12-31)"
Respuesta2
Para aclarar un poco la ya buena respuesta de Jim K:
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
Ahora podemos hacer:
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)'
Sería mucho mejor poder pasar el nombre de la macro interna para llamar desde la línea de comando del software, es decir, como argumento para Headless, pero lo dejaré para otro momento.