Справка LibreOffice 26.2
Из макросов LibreOffice Basic возможно вызывать сценарии Python, можно получить такие полезные функции, как:
Определение ComputerName или OSName;
Функция Basic FileLen() и функция API com.sun.star.ucb.SimpleFileAccess.getSize() имеют ограничения на работу с файлами размером больше 2 Гигабайт, которые можно преодолеть с помощью Python;
Нормализация com.sun.star.util.PathSettings;
и многое другое.
Прежде выполнения межъязыковых вывозов из Basic в Python, JavaScript или любой другой обработчик сценариев рекомендуется ознакомиться с функциями LibreOffice Basic и Application Programming Interface (API).
Сценарии Python могут быть локальными, разделяемыми или вложенными в документы. Для их выполнения необходимо передать LibreOffice Basic информацию о их расположении. После получения ссылки на объекты UNO, совместимые с интерфейсом com.sun.star.script.provider.XScript, сценарии Python можно исполнять:
Option Explicit
Public Function GetPythonScript(macro As String, _
Optional location As String) As com.sun.star.script.provider.Xscript
''' Захват объекта сценария Python перед выполнением
' Аргументы:
' макрос : как "library/module.py$macro" или "module.py$macro"
' область размещения: как "document" (вложенный), "share" (разделяемый), "user" (локальный) или ENUM (перечисление)
' Результат:
' ссылка на службу UNO com.sun.star.script.provider.XScript'''
If IsMissing(location) Then location = "user"
Dim mspf As Object ' com.sun.star.script.provider.MasterScriptProviderFactory
Dim sp As Object ' совместим с com.sun.star.script.provider.XScriptProvider
Dim uri As String
If location="document" Then
sp = ThisComponent.getScriptProvider()
Else
mspf = CreateUnoService("com.sun.star.script.provider.MasterScriptProviderFactory")
sp = mspf.createScriptProvider("")
End If
uri = "vnd.sun.star.script:"& macro &"?language=Python&location="& location
GetPythonScript = sp.getScript(uri)
End Function ' GetPythonScript
workstation_name = script.invoke(Array(), Array(), Array())
opSysName = script.invoke(Array(), in_outs, Array()) ' in_out — массив
file_len = script.invoke(Array(systemFilePath), Array(), Array())
normalizedPath = script.invoke(Array(systemFilePath), Array(), Array())
Представленные внизу процедуры ComputerName и GetFilelen обращаются к соответствующим обработчикам Python посредством вышеупомянутых функций GetPythonScript. Обработка исключения не детализирована.
Option Explicit
Option Compatible ' Свойства не поддерживаются
Private scr As Object ' com.sun.star.script.provider.XScript
Private Property Get ComputerName As String
'''Имя рабочей станции'''
scr = GetPythonScript("Platform.py$computer_name", "document")
ComputerName = scr.invoke(Array(), Array(), Array())
End Property ' ComputerName
Private Function GetFilelen(systemFilePath As String) As Currency
'''Размер файла в байтах'''
scr = GetPythonScript("Os/Path.py$get_size", Script.ISEMBEDDED)
GetFilelen = scr.invoke(Array(systemFilePath), Array(), Array(),)
End Function ' GetFilelen
Private Type _SCRIPT_LOCATION
ISEMBEDDED As String ' вложенный сценарий
ISPERSONAL As String ' локальный сценарий
ISSHARED As String ' макрос LibreOffice
End Type ' _SCRIPT_LOCATION
Public Function Script() As Object ' Text enumeration
Static enums As _SCRIPT_LOCATION : With enums
If .ISEMBEDDED = "" Then
.ISEMBEDDED = "document" ' вложенный сценарий
.ISPERSONAL = "user" ' локальный сценарий
.ISSHARED = "share" ' макрос LibreOffice
End If : End With ' enums
Script = enums
End Function ' Script
Вызываются два разных модуля Python. Они могут быть либо вложены в текущий документ, либо храниться в файловой системе. Проверка типа аргумента пропускается здесь для большей ясности:
Platform.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import platform
def computer_name() -> str:
return platform.node()
def OSname() -> str:
return platform.system()
Os/Path.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import os.path
def get_size(systemFilePath: str) -> str:
return str(os.path.getsize(systemFilePath))
def normalyze(systemPath: str) -> str:
return os.path.normpath(systemPath)
Механизм вызова локальных или разделяемых сценариев Python идентичен вложенным сценариям. Имена библиотек сопоставлены с папками. Определение профиля пользователя LibreOffice и путей к системным файлам общих модулей может выполняться согласно описанию в Получение информации о сеансе. Представленные ниже процедуры OSName, HelloWorld и NormalizePath вызывают функции Python с помощью упомянутой выше функции GetPythonScript. Обработка исключений не детализирована.
Option Explicit
Option Compatible ' Свойства поддерживаются
Private scr As Object ' com.sun.star.script.provider.XScript
Private Property Get OSName As String
'''Имя платформы в виде строки "Linux", "Darwin" или "Windows"'''
scr = GetPythonScript("Platform.py$OSname", Script.ISPERSONAL)
OSName = scr.invoke(Array(), Array(), Array())
End Property ' OSName
Private Sub HelloWorld()
'''Образец кода Python для LibreOffice'''
scr = GetPythonScript("HelloWorld.py$HelloWorldPython", Script.ISSHARED)
scr.invoke(Array(), Array(), Array(),)
End Sub ' HelloWorld
Public Function NormalizePath(systemFilePath As String) As String
'''Вырезать избыточные символы '\..' в пути'''
scr = GetPythonScript("Os/Path.py$normalyze", "user")
NormalizePath = scr.invoke(Array(systemFilePath), Array(), Array())
End Function ' NormalizePath
Встроенный Python LibreOffice содержит множество стандартных библиотек, которыми можно воспользоваться. Они обладают богатым набором функций, таких как, но не ограничиваясь:
argparse Парсер параметров, аргументов и подкоманд командной строки
cmath Математические функции для комплексных чисел
csv Чтение и запись CSV-файлов
datetime Специализированные типы даты и времени
json Кодировка и декодировка JSON
math Математические функции
re Операции с регулярными выражениями
socket Низкоуровневый сетевой интерфейс
sys Системно-зависимые параметры и функции
unittest и trace Фреймворк для юнит-тестов и отслеживания исполнения кода Python
xml.etree.ElementTree ElementTree XML API