Выполнить макрос LibreOffice Cal c Basi c из python - PullRequest
1 голос
/ 03 апреля 2020

Я пытаюсь автоматизировать электронную таблицу LibreOffice, используя Python. Я получаю рабочий стол и открываю электронную таблицу с

file_url = uno.systemPathToFileUrl(os.path.abspath("/path/to/file/estimation.xlsm"))
doc = desktop.loadComponentFromURL(file_url, "_blank", 0, oo_properties(MacroExecutionMode=4))

. Следующий код напечатает скрипт basi c

the_basic_libs = doc.BasicLibraries
the_vba = the_basic_libs.getByName("VBAProject")
the_takerate = the_vba.getByName("TakeRate")
print(the_takerate)

Первые напечатанные строки модуля:

Rem Attribute VBA_ModuleType=VBAModule
Option VBASupport 1

Public Sub TakeRateScenarioAnalysis()
Dim StartCell As Range

Я получаю скрипт с помощью

oor = OORunner()
msp = oor.get_context().getValueByName("/singletons/com.sun.star.script.provider.theMasterScriptProviderFactory")
sp = msp.createScriptProvider("")
scriptx = sp.getScript("vnd.sun.star.script:VBAProject.TakeRate.TakeRateScenarioAnalysis?language=Basic&location=document")

Возвращается следующая ошибка

Traceback (most recent call last):
  File "./runProjectEstimate.py", line 198, in <module>
    scriptx = sp.getScript("vnd.sun.star.script:VBAProject.TakeRate.TakeRateScenarioAnalysis?language=Basic&location=document")
__main__.ScriptFrameworkErrorException: The following Basic script could not be found:
library: 'VBAProject'
module: 'TakeRate'
method: 'TakeRateScenarioAnalysis'
location: 'document'

Есть ли проблема с URI скрипта? Я не знаю, почему я могу напечатать сценарий, но поставщик сценариев не может его найти.

1 Ответ

0 голосов
/ 03 апреля 2020

У меня сработало следующее:

scriptx = sp.getScript(
    'vnd.sun.star.script:Standard.Module1.TakeRateScenarioAnalysis?'
    'language=Basic&location=application')

Однако, как описано в вашем вопросе, это не так:

scriptx = sp.getScript(
    "vnd.sun.star.script:VBAProject.TakeRate.TakeRateScenarioAnalysis?"
    "language=Basic&location=document")

Из этих результатов, кажется, невозможно позвонить Макросы таким образом, когда они хранятся в документах. Скорее всего, это вопрос разрешений. Вызов макросов из документов, которые могли быть созданы кем-то другим, является хорошим способом распространения вирусов, поэтому LO пытается предотвратить это.

Было бы приемлемо переместить вашу библиотеку VBAProject в My Macros вместо внутри документа? Тогда все должно работать как положено.

Пара связанных ссылок, которые могут дать больше идей:

...