Axuda do Collabora Office 24.04
É posíbel invocar scripts en Python desde as macros en Basic do Collabora Office, co que se obteñen funcionalidades valiosas, como:
É posíbel identificar ComputerName ou OSName,
A función FileLen() do Basic e a función da API com.sun.star.ucb.SimpleFileAccess.getSize() presentan un límite superior de tamaño de ficheiro de 2 GB, que Python axuda a superar,
É posíbel normalizarcom.sun.star.util.PathSettings,
e moito máis
Recoméndase unha exposición razoábel ao Basic do Collabora Office e ás funcionalidades da súa Interface de Programación de Aplicacións (API) con antelación á realización de chamadas inter-linguaxes do Basic a Python, JavaScript ou calquera outro motor de scripts.
Os scripts en Python poden ser persoais, compartidos ou incorporados aos documentos. Para executalos, o Basic do Collabora Office precisa coñecer onde están situados os scripts en Python. Localizar os obxectos UNO compatíbeis coa interface com.sun.star.script.provider.XScript permite a execución de scripts en Python:
Option Explicit
Public Function GetPythonScript(macro As String, _
Optional location As String) As com.sun.star.script.provider.Xscript
''' Obter o obxeto do programa en Python antes da execución
' Parámetros:
' macro : como "library/module.py$macro" ou "module.py$macro"
' posición: como «documento», «compartir», «usuario» ou ENUM(eración)
' Resultado:
' Atopado o servizo com.sun.star.script.provider.XScript UNO'''
If IsMissing(location) Then location = "user"
Dim mspf As Object ' com.sun.star.script.provider.MasterScriptProviderFactory
Dim sp As Object 'compatible con 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 é unha matriz
file_len = script.invoke(Array(systemFilePath), Array(), Array())
normalizedPath = script.invoke(Array(systemFilePath), Array(), Array())
Os subprogramas ComputerName e GetFilelen executan os seus equivalentes en Python, usando a función previamente citada GetPythonScript. Non se describe o control de excepcións.
Option Explicit
Option Compatible ' Permitense propiedades
Private scr As Object ' com.sun.star.script.provider.XScript
Private Property Get ComputerName As String
'''Nome do ordenador'''
scr = GetPythonScript("Platform.py$computer_name", "document")
ComputerName = scr.invoke(Array(), Array(), Array())
End Property ' ComputerName
Private Function GetFilelen(systemFilePath As String) As Currency
'''Tamaño do arquivo en octetos'''
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 ' Programa do documento
ISPERSONAL As String ' Programa do usuario
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" ' Programa do documento
.ISPERSONAL = "user" ' Programas do usuario
.ISSHARED = "share" ' macro do Collabora Office
End If : End With ' enums
Script = enums
End Function ' Script
Execútanse dous módulos diferentes de Python. Poden estar incrustados no documento actual ou estar gardados no sistema de ficheiros. Non se comproban os tipos dos parámetros por claridade:
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)
A forma de executar programas de Python persoais ou compartidos é igual á forma de executar programas incrustados. Os nomes das bibliotecas son enlazadas a cartafoles. Para obter as rutas no sistema de arquivos dos módulos do perfil do usuario e compartidos pódese facer da maneira descrita en Obter información da sesión. No seguinte exemplo os subprogramas OSName, HelloWorld e NormalizePath estan executando as correspondentes subrutinas en Python, usando a función GetPythonScript. Non se describe o control de excepcións.
Option Explicit
Option Compatible ' Permitense propiedades
Private scr As Object ' com.sun.star.script.provider.XScript
Private Property Get OSName As String
'''O nome das plataformas ten que ser "Linux", "Darwin" ou "Windows"'''
scr = GetPythonScript("Platform.py$OSname", Script.ISPERSONAL)
OSName = scr.invoke(Array(), Array(), Array())
End Property ' OSName
Private Sub HelloWorld()
'''Mostra compartida en Python de Collabora Office'''
scr = GetPythonScript("HelloWorld.py$HelloWorldPython", Script.ISSHARED)
scr.invoke(Array(), Array(), Array(),)
End Sub ' HelloWorld
Public Function NormalizePath(systemFilePath As String) As String
'''Eliminar o '\..' innecesario da ruta'''
scr = GetPythonScript("Os/Path.py$normalyze", "user")
NormalizePath = scr.invoke(Array(systemFilePath), Array(), Array())
End Function ' NormalizePath
O Python incrustado en Collabora Office ten moitas bibliotecas que pode aproveitar. Proveen un gran abano de ferramentas, por exemplo:
argparse Intérprete de opcións da liña de comandos, parámetros e subcomandos
cmath Funcións matemáticas para números complexos
csv Leer e escribir arquivos CSV
datetime Tipos de data e tempo verdadeiros
json Codificador e descodificador de JSON
math Funcións matemáticas
re Operacións con expresións regulares
socket Interface de operacións con redes de baixo nivel
sys Funcións e parámetros específicos do sistema
unittest e trace Armazón para os sistemas de probas e para seguir a execución en Python, respectivamente
xml.etree.ElementTree Interface de programación XML do ElementTree