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鈥檃rguments. Els atributs Private o Public no tenen efecte. La comprovaci贸 del tipus d鈥檃rguments s鈥檌gnora 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!