如何在没有 GUI 的情况下从命令行运行 LibreOffice 宏?

如何在没有 GUI 的情况下从命令行运行 LibreOffice 宏?

我想从命令行对 .odt 文件运行 LibreOffice 宏。因为我想将其扩展到将宏应用于多个文件,所以我不希望每次执行宏时都弹出 GUI。

我目前有一个工作宏(它也在最后关闭文件),据我所知,我应该能够按如下方式调用它:

soffice --invisible --nofirststartwizard --headless --norestore "D:\myFolder\my file.odt" "macro:///Standard.Module1.myMacro"

或者

swriter --invisible --nofirststartwizard --headless --norestore "D:\myFolder\my file.odt" "macro:///Standard.Module1.myMacro"

这两个命令都可以正确执行宏,但是 GUI 在执行过程中会打开和关闭。如何防止这种情况发生?

我正在使用 Windows 10 电脑,帮助>关于 LibreOffice提供了以下信息:

版本:5.2.1.2
版本 ID:31dd62db80d4e60af04904455ec9c9219178d620
CPU 线程:4;操作系统版本:Windows 6.2;UI 渲染:默认;
区域设置:en-US (en_US);计算:CL

答案1

问题是,尽管 LibreOffice 在启动时不可见,但在打开文档后会变为可见。解决方案如下:https://forum.openoffice.org/en/forum/viewtopic.php?f=5&t=22548

  1. 运行 LibreOffice headless 来调用宏。命令行调用应该不是指定要打开的文档,只需一个宏即可。例如(使用较新的宏语法):

    soffice -headless -invisible "vnd.sun.star.script:Standard.Module1.MySubroutine?language=Basic&location=application"

  2. 宏调用加载组件将该Hidden属性设置为 true。这将导致文档不可见。

  3. 现在宏将执行对文档进行的所有操作。

编辑

为了使其适用于不同的文件,请使用较旧的宏语法将文件名作为参数传递。以下示例来自https://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=8232

soffice "macro:///Library3.Module1.test_Args(arg1,123,4.567,2000-12-31)"

答案2

稍微澄清一下 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

现在我们可以这样做:

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

能够传入内部宏的名称以从 soffice 命令行调用,即作为 Headless 的参数,这会更好,但我将把它留到下次再做。

相关内容