Llamar macros en Basic desde Python

Es posible llamar macros escritas en LibreOffice Basic desde secuencias de 贸rdenes en Python y sacar provecho de funcionalidades tales como:

El marco de programaci贸n de macros de la API (interfaz de programaci贸n de aplicaciones) de LibreOffice admite la ejecuci贸n de secuencias de 贸rdenes entre Python y Basic u otros lenguajes de programaci贸n admitidos. Los argumentos se pueden pasar de un lado a otro entre llamadas, siempre que representen tipos de datos primitivos que ambos lenguajes reconozcan y suponiendo que el marco de programaci贸n de macros los convierta de forma adecuada.

tip

Es recomendable familiarizarse con los m贸dulos est谩ndares de Python y las funcionalidades de la API de LibreOffice antes de efectuar llamadas entre los lenguajes Python, Basic, JavaScript o cualquier otro motor de secuencias de 贸rdenes.


warning

Es posible que, al intentar ejecutar secuencias de 贸rdenes escritas en Python desde un entorno de desarrollo integrado (EDI), falte el motor de BASIC incrustado en LibreOffice. En estos contextos, evite las llamadas de Python a LibreOffice聽Basic. Por el contrario, el entorno Python y los objetos de red universales (UNO, por sus siglas en ingl茅s) siempre estar谩n disponibles. Para m谩s informaci贸n, consulte Puesta en funcionamiento de un EDI para Python.


Recuperaci贸n de secuencias de 贸rdenes en Basic en LibreOffice

Las macros de LibreOffice BASIC pueden ser de uso personal, compartidas o estar incrustadas en los documentos. Para poder ejecutarlas, ha de proveerse un entorno de ejecuci贸n de Python con las ubicaciones de macros de BASIC. La implementaci贸n de la interfaz com.sun.star.script.provider.XScriptProvider permite recuperar macros ejecutables:


		 import uno
		 from com.sun.star.script.provider import Xscript
		     
		 def getBasicScript(macro='Main', module='Module1', library='Standard',
		         isEmbedded=False) -> XScript:
		     '''Tomar el objeto de secuencia de Basic antes de la invocaci贸n.'''
		     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
		 

Ejecuci贸n de secuencias de 贸rdenes en Basic en LibreOffice

La documentaci贸n del Kit de desarrollo de software (SDK) de LibreOffice correspondiente a la interfaz com.sun.star.script.provider.XScript detalla la convenci贸n para efectuar llamadas entre lenguajes de programaci贸n. La invocaci贸n de funciones requere tres matrices:

Sintaxis de Python

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

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

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

Ejemplos de secuencias de 贸rdenes personales o compartidas

Algunos ejemplos sobre la entrada/salida a la pantalla detallan c贸mo realizar las llamadas de invocaci贸n a Basic desde Python. En Monitorizaci贸n de eventos de documento, se muestra el uso del comod铆n *args en el lenguaje Python para imprimir un n煤mero variable de par谩metros en el di谩logo de la consola de registros de Access2Base.

tip

Mientras est谩 desarrollando su macro, puede interrumpir la ejecuci贸n de la secuencia de 贸rdenes de Python si utiliza la extensi贸n Xray para inspeccionar las propiedades y m茅todos de objetos UNO. El depurador de extensiones APSO permite la introspecci贸n de objetos cuando usa las extensiones Xray o MRI.



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

Ejemplos de secuencias de 贸rdenes incrustadas en documentos

La sintaxis simplificada de Python *args puede ser usada en conjunto con rutinas Basic de LibreOffice que acepten un n煤mero variable de argumentos. M谩s abajo, las funciones de Python Print y SUM llaman a sus contrapartes de Basic Print y SUM en la ya mencionada funci贸n getBasicScript. El manejo de excepciones no se detalla.


	  # -*- coding: utf-8 -*-
	  from __future__ import unicode_literals
	      
	  def Print(*args):
	      """Muestra las cadenas o expresiones num茅ricas especificadas en un cuadro de di谩logo."""
	      xScript = getBasicScript("Print", "Scripting", embedded=True)
	      xScript.invoke((args), (), ())
	      
	  def SUM(*args):
	      """SUMA la expresi贸n 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,)
	  

Las rutinas de LibreOffice Basic Print y SUM, basadas en documentos, aceptan un n煤mero variable de argumentos. Los atributos Private o Public no tienen efecto. La comprobaci贸n del tipo de argumentos se omite por claridad.


	  Option Compatible ' "Standard.Scripting" module
	  Option Explicit
	      
	  Private Sub Print(ParamArray args() As Variant, Optional sep As String = " ")
	      ''' Imprimir la lista de n煤mero variable de elementos '''
	      ' se aceptan todos los argumentos convertibles de 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
	      ''' SUM (suma) una lista variable de n煤meros '''
	      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()
	  

隆Necesitamos su ayuda!