Crida a macros Basic des de Python

Podeu cridar les macros BASIC del LibreOffice des dels scripts de Python, i es poden obtenir funcionalitats destacables com a retorn, com ara:

La interf铆cie de programaci贸 d'aplicacions (API) de LibreOffice, admet l'execuci贸 de scripts entre llenguatges Python i Basic, o altres llenguatges de programaci贸 compatibles. Els arguments es poden passar en els dos sentits de les crides sempre que representin tipus de dades primitius que els dos llenguatges reconeguin, i assumint que l'entorn de scripts els converteix de manera adequada.

tip

Es recomana tenir 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 a Basic, JavaScript o qualsevol altre motor de scripts.


warning

Quan s'executen scripts de Python des d'un Entorn de Desenvolupament Integrat (IDE), el motor de base integrat a LibreOffice pot estar absent. Evitar les crides de Python al Basic de LibreOffice en aquests contextos. Tanmateix, l'entorn Python i els objectes de xarxes universals (UNO) estan totalment disponibles. Consulteu Configuraci贸 del IDE integrat per a Python per obtenir m茅s informaci贸.


S'estan recuperant els scripts Basic de LibreOffice

Les macros Basic LibreOffice 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:
		     '''Captureu l'objecte script de 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 Basic de LibreOffice

La documentaci贸 del Software Development Kit (SDK) de 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/Sortida 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

Durant el per铆ode de 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贸 per a la depuraci贸 APSO 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 seves corresponents Basic Printi SUMutilitzant la funci贸 getBasicScript . La gesti贸 d'excepcions no est脿 detallada.


	  # -*- coding: utf-8 -*-
	  from __future__ import unicode_literals
	      
	  def Print(*args):
	      ""Extreu les cadenes o expressions num猫riques especificades en un quadre de 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 Basic de LibreOffice Print i SUM accepten un nombre variable d鈥檃rguments. Els atributs Private o Public no tenen efecte. La comprovaci贸 del tipus d鈥檃rguments s鈥檌gnora per tenir m茅s claredat.


	  Option Compatible ' "Standard.Scripting" module
	  Option Explicit
	      
	  Private Sub Print(ParamArray args() As Variant, Optional sep As String = " ")
	      ''' Imprimeix la llista del nombre variable d'elements'''
	      ' 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 variable de nombres'''
	      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!