Ajuda do Collabora Office 24.04
É possível chamar scripts Python a partir de macros do Collabora Office Basic e obter valiosos recursos, tais como:
Possibilidade de identificar o ComputerName ou detectar o OSName,
A função Basic FileLen() e função API com.sun.star.ucb.SimpleFileAccess.getSize() apresentam o limite de tamanho de 2 GB que o Python pode superar,
com.sun.star.util.PathSettings pode ser normalizado,
e muito mais.
Recomenda-se certo conhecimento dos recursos do Collabora Office Basic e da interface de programação da aplicação (API) antes de executar as chamadas entre a linguagem Basic para Python, para Javascript, ou qualquer outro motor de scripts.
Os scripts em Python podem ser pessoais, compartilhados ou embutidos em documentos. Para executá-los, o Collabora Office Basic deve conhecer as localidades dos scripts Python. Localizar os objetos UNO que verificam a interface com.sun.star.script.provider.XScript permite a execução de scripts Python:
Option Explicit
Public Function GetPythonScript(macro As String, _
Optional location As String) As com.sun.star.script.provider.Xscript
''' Obter o objeto script Python antes da execução
' Argumentos:
' macro : como "library/module.py$macro" ou "module.py$macro"
' local: como "document", "share", "user" ou ENUM(eração)
' Resultado:
' localizado o serviço 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 ' compatível com 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 é um Array
file_len = script.invoke(Array(systemFilePath), Array(), Array())
normalizedPath = script.invoke(Array(systemFilePath), Array(), Array())
As rotinas ComputerName, e GetFilelen abaixo chamam suas contrapartidas em Python, utilizando a função GetPythonScript. O tratamento de exceções não é detalhado aqui.
Option Explicit
Option Compatible ' Propriedades tem suporte
Private scr As Object ' com.sun.star.script.provider.XScript
Private Property Get ComputerName As String
'''Nome da Workstation'''
scr = GetPythonScript("Platform.py$computer_name", "document")
ComputerName = scr.invoke(Array(), Array(), Array())
End Property ' ComputerName
Private Function GetFilelen(systemFilePath As String) As Currency
'''Tamanho do arquivo em bytes'''
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 ' script do documento
ISPERSONAL As String ' script do usuário
ISSHARED As String ' Macro do Collabora Office
End Type ' _SCRIPT_LOCATION
Public Function Script() As Object ' Text enumeration
Static enums As _SCRIPT_LOCATION : With enums
If .ISEMBEDDED = "" Then
.ISEMBEDDED = "document" ' script do document
.ISPERSONAL = "user" ' script do usuário
.ISSHARED = "share" ' Macro do Collabora Office
End If : End With ' enums
Script = enums
End Function ' Script
São chamados dois módulos Python diferentes. Podem ser embutidos no documento atual ou armazenados no sistema de arquivos. Por clareza, omitiu-se a verificação dos argumentos:
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)
O mecanismo de chamadas aos scripts Python pessoais ou compartilhados é idêntico ao dos scripts embutidos. Os nomes de bibliotecas são mapeados em pastas. Pode-se computar os caminhos do perfil do usuário do Collabora Office e dos módulos compartilhados em Obter informação da sessão. As rotinas OSName, HelloWorld e NormalizePath abaixo chamam suas contrapartidas em Python, utilizando a função GetPythonScript. O tratamento de exceções não foi detalhado.
Option Explicit
Option Compatible ' Propriedades são suportadas
Private scr As Object ' com.sun.star.script.provider.XScript
Private Property Get OSName As String
'''Nome de plataforma, como «Linux», «Darwin» ou «Windows»'''
scr = GetPythonScript("Platform.py$OSname", Script.ISPERSONAL)
OSName = scr.invoke(Array(), Array(), Array())
End Property ' OSName
Private Sub HelloWorld()
'''exemplo de Collabora Office Python compartilhado'''
scr = GetPythonScript("HelloWorld.py$HelloWorldPython", Script.ISSHARED)
scr.invoke(Array(), Array(), Array(),)
End Sub ' HelloWorld
Public Function NormalizePath(systemFilePath As String) As String
'''Eliminar '\..' supérfluo no caminho'''
scr = GetPythonScript("Os/Path.py$normalyze", "user")
NormalizePath = scr.invoke(Array(systemFilePath), Array(), Array())
End Function ' NormalizePath
O Python incluso no Collabora Office contém muitas bibliotecas padrão para proveito. Carregam um rico conjunto de recursos, tais que e não limitados a:
argparse Analisador de opções da linha de comando, argumentos e subcomandos
cmath Funções matemáticas para números complexos
csv Leitura e gravação de arquivos CSV
datetime Tipos de data e hora genuínos
json Codificador e decodificador JSON
math Funções matemáticas
re operações com expressões regulares
socket interface de rede de baixo nível
sys parâmetros e funções específicos do sistema
unittest e trace framework de unidades de teste e tracking de execução do Python
xml.etree.ElementTree API de XML ElementTree