Basic Makros aus Python aufrufen

Sie können LibreOffice Basic-Makros aus Python-Skripten aufrufen und erhalten im Gegenzug folgende bemerkenswerte Funktionen:

Das Scripting-Framework der LibreOffice-Anwendungsprogrammierschnittstelle (API) unterstützt die Ausführung von Skripten zwischen Python und Basic oder anderen unterstützten Programmiersprachen. Argumente können zwischen Aufrufen hin und her übergeben werden, sofern sie primitive Datentypen darstellen, die von beiden Sprachen erkannt werden, und vorausgesetzt, dass sie vom Scripting-Framework ordnungsgemäß konvertiert werden.

tip

Es wird empfohlen, sich mit den Python-Standardmodulen und den LibreOffice-API-Funktionen vertraut zu machen, bevor Sie Sprachaufrufe von Python an Basic, JavaScript oder eine andere Skript-Engine ausführen.


warning

Beim Ausführen von Python-Skripten in einer IDE (Integrated Development Environment) fehlt möglicherweise die geschachtelte LibreOffice Basic-Engine. Vermeiden Sie in einem solchen Kontext Aufrufe von Python an LibreOffice Basic. Die Python-Umgebung und das Universal Networks Objects (UNO) sind jedoch vollständig verfügbar. Weitere Informationen finden Sie unter Einrichten einer integrierten IDE für Python.


LibreOffice Basic-Skripte abrufen

Grundlegende LibreOffice Makros können privat, gemeinsam oder in Dokumente eingebettet sein. Um sie auszuführen, muss die Python-Runtime mit Basic-Makro-Positionen versehen werden. Das Implementieren der Schnittstelle com.sun.star.script.provider.XScriptProvider ermöglicht den Abruf von ausführbaren Skripten:


		 import uno
		 from com.sun.star.script.provider import Xscript
		     
		 def getBasicScript(macro='Main', module='Module1', library='Standard',
		         isEmbedded=False) -> XScript:
		     '''Grundlegendes Skript-Objekt vor dem Aufruf abrufen.'''
		     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
		 

LibreOffice Basic-Skripte ausführen

In der LibreOffice Software Development Kit (SDK)-Dokumentation für die com.sun.star.script.provider.XScript-Schnittstelle wird die Aufrufkonvention für Sprachaufrufe beschrieben. Der Aufruf von Funktionen erfordert drei Arrays:

Python-Syntax

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

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

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

Beispiele für private oder gemeinsam genutzte Skripte

Beispiele inEin-/Ausgabe auf dem Bildschirm beschreiben die Aufrufe von Python zu Basic. Überwachen von Dokumentereignissen veranschaulicht die Verwendung der *args-Python-Sprache zum Drucken einer variablen Anzahl von Parametern in Access2Base im Dialog Protokollierungskonsole.

tip

Zum Zeitpunkt der Programmierung können Sie die Ausführung des Python-Skripts unterbrechen, indem Sie die Xray-Extension verwenden, um die Eigenschaften und Methoden von UNO-Objekten zu überprüfen. Der ASPO-Erweiterungs-Debugger ermöglicht die Objekt-Introspektion mithilfe von Xray- oder MRI-Extensions.



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

Beispiele für eingebettete Skripte in Dokumenten

Die vereinfachte *args-Syntax von Python kann in Verbindung mit LibreOffice Basic-Routinen verwendet werden, die eine variable Anzahl von Argumenten akzeptieren. Unterhalb der Python-Funktionen Print und SUM werden die entsprechenden Gegenstücke Print und SUM mit der oben genannten Funktion getBasicScript aufgerufen. Die Ausnahmebehandlung ist nicht detailliert.


	  # -*- coding: utf-8 -*-
	  from __future__ import unicode_literals
	      
	  def Print(*args):
	      """Gibt die angegebenen Zeichenfolgen oder numerischen Ausdrücke in einem Dialog aus."""
	      xScript = getBasicScript("Print", "Scripting", embedded=True)
	      xScript.invoke((args), (), ())
	      
	  def SUM(*args):
	      """SUM des angegebenen Zahlenausdrucks."""
	      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,)
	  

Die Dokument-basierten LibreOffice Basic-Routinen Print und SUM akzeptieren eine variable Anzahl von Argumenten. Die Attribute Private oder Public haben keine Auswirkung. Die Überprüfung des Argumenttyps wird aus Gründen der Übersichtlichkeit übersprungen.


	  Option Compatible ' "Standard.Scripting" module
	  Option Explicit
	      
	  Private Sub Print(ParamArray args() As Variant, Optional sep As String = " ")
	      '''Artikelliste der Variablennummer drucken'''
	      ' alle konvertierbaren CStr()-Argumente werden akzeptiert
	      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 ist eine variable Liste von Zahlen '''
	      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()
	  

Bitte unterstützen Sie uns!