·

Crida a macros bàsiques des de Python

Podeu cridar les macros bàsiques de LibreOffice des dels scripts de Python, i es poden obtindre característiques destacables a canvi, com ara:

The LibreOffice Application Programming Interface (API) Scripting Framework supports inter-language script execution between Python and Basic, or other supported programming languages for that matter. Arguments can be passed back and forth across calls, provided that they represent primitive data types that both languages recognize, and assuming that the Scripting Framework converts them appropriately.

tip

Es recomana tindre coneixement dels mòduls estàndard de Python i de les característiques de l'API de LibreOffice abans de realitzar crides des de Python al Basic, JavaScript o qualsevol altre motor d'scripts.


warning

When running Python scripts from an Integrated Development Environment (IDE), the LibreOffice-embedded Basic engine may be absent. Avoid Python-to-LibreOffice Basic calls in such contexts. However Python environment and Universal Networks Objects (UNO) are fully available. Refer to Setting Up an Integrated IDE for Python for more information.


S'estan recuperant els scripts de LibreOffice Basic

Les macros LibreOffice Basic poden ser personals, compartides, o incrustades en documents. Per tal d'executar-les, cal proporcionar a l'entorn d'execució de Python les ubicacions de les macro de Basic. Implementar la interfície com.sun.star.script.provider.XScriptProvider permet la recuperació d'scripts executables

<bookmarkvalue>API;script.provider.MasterScriptProviderFactory: Recuperació d'scripts Basic</bookmarkvalue><bookmarkvalue>API;script.provider.XScript Execució d'scripts Basic</bookmarkvalue><bookmarkvalue>API;XScriptProvider Recuperació d'scripts Basic </bookmarkvalue>

		 import uno
		 from com.sun.star.script.provider import Xscript
		     
		 def getBasicScript(macro='Main', module='Module1', library='Standard',
		         isEmbedded=False) -> XScript:
		     '''Obteniu l'objecte script Basic abans d'invocar-lo.'''
		     ctx = uno.getComponentContext()
		     smgr = ctx.ServiceManager
		     if isEmbedded:
		         desktop = smgr.createInstanceWithContext('com.sun.star.frame.Desktop', ctx)
		         scriptPro = desktop.CurrentComponent.getScriptProvider()
		         location = "document"
		     else:
		         mspf = smgr.createInstanceWithContext(
		             "com.sun.star.script.provider.MasterScriptProviderFactory", ctx)
		         scriptPro = mspf.createScriptProvider("")
		         location = "application"
		     scriptName = "vnd.sun.star.script:"+library+"."+module+"."+macro+ \
		                  "?language=Basic&location="+location
		     xScript = scriptPro.getScript(scriptName)
		     return xScript
		 

Execució d'scripts del LibreOffice Basic

La documentació del Software Development Kit (SDK) del LibreOffice corresponent a la interfície com.sun.star.script.provider.XScript detalla la convenció de crides entre llenguatges. La invocació de funcions requereix tres matrius:

Sintaxi Python

results = script.invoke((prompt,buttons,title), (), ())

script.invoke((message,), tuple, ())

script.invoke((args), (), results)

Exemples d'scripts personals o compartits

Exemples a Entrada/Eixida a Pantalla detall de crides d'invocació Python a Basic. El Monitoratge d'esdeveniments dels documents mostra l'ús de *args de Python per imprimir el nombre variable de paràmetres a la consola Access2Base.

tip

En el moment del desenvolupament podeu interrompre l'execució dels scripts en Python utilitzant l' Extensió xray per tal d'inspeccionar propietats i mètodes d'objectes UNO. L'extensió APSO per a la depurarció, permet la introspecció d'objectes utilitzant qualsevol de les extensions Xray o MRI.



	  def xray(myObject):
	  	  script = getBasicScript(library="XrayTool", module="_Main", macro="Xray")
	  	  script.invoke((myObject,), (), ())
	  

Exemples d'scripts incrustats als documents

La sintaxi simplificada de Python *args es pot utilitzar conjuntament amb les rutines Basic de LibreOffice que accepten un nombre variable d'arguments. A continuació les funcions Python Printi SUM criden les seues corresponents a Basic Printi SUMutilitzant la funció getBasicScript . La gestió d'excepcions no és detallada.


	  # -*- coding: utf-8 -*-
	  from __future__ import unicode_literals
	      
	  def Print(*args):
	      ""Extreu les cadenes o expressions numèriques especificades en un diàleg."""
	      xScript = getBasicScript("Print", "Scripting", embedded=True)
	      xScript.invoke((args), (), ())
	      
	  def SUM(*args):
	      ""SUMA l'expressió numèrica especificada.""
	      xScript = getBasicScript("SUM", "Scripting", embedded=True)
	      res = xScript.invoke((args), (), ())
	      return res[0]
	      
	  # def getBasicScript()  # see above
	      
	  def playWithArgs():
	      Print("Fun with *args ", -9.81, 297864.681974, 8762E-137)
	      Print(SUM(45, -9.81, 297864.681974))
	      Print(SUM(45, -9.81, 297864.681974, 8762E+137))
	      
	  g_exportedScripts = (playWithArgs,)
	  

Les rutines basades en documents de LibreOffice Basic Print and SUM accepten un nombre variable d’arguments. Els atributs Private o Public no tenen efecte. La comprovació del tipus d’arguments s’ignora per tindre més claredat.


	  Option Compatible ' "Standard.Scripting" module
	  Option Explicit
	      
	  Private Sub Print(ParamArray args() As Variant, Optional sep As String = " ")
	      ''' Imprimeix la llista d'elements en nombre variable '''
	      ' s'accepten tots els arguments convertibles mitjançant CStr()
	      Dim str As String, i As Integer
	      If UBound(args) >= 0 Then
	          For i = 0 To UBound(args)
	              str = str + Cstr(args(i))+ sep 
	          Next i
	      End If
	      Print str
	  End Sub ' Standard.Scripting.Print()
	      
	  Public Function SUM(ParamArray args() As Variant) As Variant
	      ''' SUMA una llista de nombres variable '''
	      Dim ndx As Integer
	      If UBound(args) >= 0 Then
	          For ndx = 0 To UBound(args)
	              SUM = SUM + args(ndx)
	          Next ndx
	      End If
	  End Function ' Standard.Scripting.SUM()
	  

Ens cal la vostra ajuda!