如何在沒有 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. 巨集調用從 URL 載入元件屬性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 的參數,那就更好了,但我將在下次再討論。

相關內容