Как запустить макрос LibreOffice из командной строки без графического интерфейса?

Как запустить макрос LibreOffice из командной строки без графического интерфейса?

Я хочу запустить макрос LibreOffice на .odt-файле(ах) из командной строки. Поскольку я хочу масштабировать это для применения макроса к нескольким файлам, я не хочу, чтобы 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
Идентификатор сборки: 31dd62db80d4e60af04904455ec9c9219178d620
Потоки ЦП: 4; Версия ОС: Windows 6.2; Отображение пользовательского интерфейса: по умолчанию;
Язык: 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. Макрос вызываетloadComponentFromUrlсо 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

Чтобы немного прояснить и без того хороший ответ Джима К.:

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, но я оставлю это на другой раз.

Связанный контент