Guida di LibreOffice 24.8
È possibile richiamare script Python dalle LibreOffice macro di Basic e si possono ottenere valide funzioni, come ad esempio:
la possibilità di identificazione ComputerNameo di rilevazione OSName
le funzioni Basic FileLen() e API com.sun.star.ucb.SimpleFileAccess.getSize() presentano un limite superiore di dimensione del file di 2 Gigabyte che Python consente di superare,
la possibilità di normalizzazione di com.sun.star.util.PathSettings
e molte altre ancora.
È consigliabile un adeguato approccio a LibreOffice Basic e ad Application Programming Interface (API) prima di eseguire funzioni di chiamata tra linguaggi Basic, Python, JavaScript o qualsiasi altro motore di script.
Gli script Python possono essere personali, condivisi o incorporati nei documenti. Per poterli eseguire, LibreOffice Basic deve disporre della posizione degli script Python. L'individuazione di oggetti UNO compatibili con l'interfaccia com.sun.star.script.provider.XScript consente l'esecuzione di script Python:
Option Explicit
Public Function GetPythonScript(macro As String, _
Optional location As String) As com.sun.star.script.provider.Xscript
''' Recupera l'oggetto di script Python prima dell'esecuzione
' Argomenti:
' macro : come "library/module.py$macro" o "module.py$macro"
' location: come "document", "share", "user" o ENUM(eration)
' Risultato:
' individuato il servizio di 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 ' compatibile 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 è una matrice
file_len = script.invoke(Array(systemFilePath), Array(), Array())
normalizedPath = script.invoke(Array(systemFilePath), Array(), Array())
Le routine seguenti ComputerName e GetFilelen richiamano le corrispondenti controparti Python mediante la funzione GetPythonScript precedentemente menzionata. La gestione delle eccezioni non è dettagliata.
Option Explicit
Option Compatible ' Sono supportate le proprietà
Private scr As Object ' com.sun.star.script.provider.XScript
Private Property Get ComputerName As String
'''Nome 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
'''Dimensione file in byte'''
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 documento
ISPERSONAL As String ' script utente
ISSHARED As String ' macro di LibreOffice
End Type ' _SCRIPT_LOCATION
Public Function Script() As Object ' Text enumeration
Static enums As _SCRIPT_LOCATION : With enums
If .ISEMBEDDED = "" Then
.ISEMBEDDED = "document" ' script documento
.ISPERSONAL = "user" ' script utente
.ISSHARED = "share" ' macro di LibreOffice
End If : End With ' enums
Script = enums
End Function ' Script
Vengono richiamati due diversi moduli Python. Possono essere incorporati nel documento corrente o memorizzati nel file system. Il controllo del tipo di argomento per chiarezza viene tralasciato:
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)
Il meccanismo di chiamata per script Python personali o condivisi è identico a quello degli script incorporati. I nomi delle librerie sono mappati in cartelle. L'elaborazione del profilo utente LibreOffice e dei percorsi dei file di sistema relativi ai moduli condivisi si possono eseguire come descritto in Ottenere informazioni sulla sessione. Le routine seguenti OSName, HelloWorld e NormalizePath richiamano le corrispondenti controparti Python mediante la funzione GetPythonScript precedentemente menzionata. La gestione delle eccezioni non è dettagliata.
Option Explicit
Option Compatible ' Sono supportate le proprietà
Private scr As Object ' com.sun.star.script.provider.XScript
Private Property Get OSName As String
'''Nome piattaforma come "Linux", "Darwin" o "Windows"'''
scr = GetPythonScript("Platform.py$OSname", Script.ISPERSONAL)
OSName = scr.invoke(Array(), Array(), Array())
End Property ' OSName
Private Sub HelloWorld()
'''Esempio condiviso Python di LibreOffice'''
scr = GetPythonScript("HelloWorld.py$HelloWorldPython", Script.ISSHARED)
scr.invoke(Array(), Array(), Array(),)
End Sub ' HelloWorld
Public Function NormalizePath(systemFilePath As String) As String
'''Estrae le '\..' superflue nel percorso'''
scr = GetPythonScript("Os/Path.py$normalyze", "user")
NormalizePath = scr.invoke(Array(systemFilePath), Array(), Array())
End Function ' NormalizePath
I moduli Python incorporati in LibreOffice contengono molte librerie standard da cui trarre vantaggio. Offrono una ricca gamma di funzioni, comprese, ma non esclusivamente, le seguenti:
argparse Parser per opzioni a riga di comando, argomenti e sottocomandi
cmath Funzioni matematiche per numeri complessi
csv Lettura e scrittura di file CSV
datetime Tipi di data e ora di base
json Codificatore e decodificatore JSON
math Funzioni matematiche
re Operazioni di espressione regolare
socket Interfaccia di rete di basso livello
sys Parametri e funzioni specifiche del sistema
unittest e trace Unit testing framework e Track Python execution
xml.etree.ElementTree API ElementTree XML