
Я хочу запустить макрос 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:
Запустите LibreOffice headless для вызова макроса. Вызов командной строки долженнетуказать документ для открытия, просто макрос. Например (используя новый синтаксис макроса):
soffice -headless -invisible "vnd.sun.star.script:Standard.Module1.MySubroutine?language=Basic&location=application"
Макрос вызываетloadComponentFromUrlсо
Hidden
свойством, установленным на true. Это приведет к тому, что документ не станет видимым.Теперь макрос выполняет то, что он собирался сделать с документом.
РЕДАКТИРОВАТЬ:
Чтобы это работало для разных файлов, передайте имя файла как параметр, используя старый синтаксис макроса. Пример из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, но я оставлю это на другой раз.