[teilw. gelöst] python in Calc-Zelle als Function aufrufen

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

StePfl
**
Beiträge: 47
Registriert: Mo, 04.07.2016 17:16

[teilw. gelöst] python in Calc-Zelle als Function aufrufen

Beitrag von StePfl »

Hallo zusammen,

Mein Wunsch ist, aus eine Calc-Zelle aus ein Python-Programm mit "=PyHelloWorld()" aufzurufen, dass der "Return"-Wert in der aufrufenden Zelle dargestellt wird. (in Analogie zum Aufruf einer StarBasic-Function) Leider habe ich trotz Web-Suche keine Antwort für folgende Frage gefunden: (bzw. nicht als solche verstanden)

Details:
ich habe eine Datei "PyHelloWorld.py" im Verzeichnis "/home/stefan/.config/libreoffice/4/user/Scripts/Python" mit folgendem Inhalt angelegt:

Code: Alles auswählen

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# Autor: StePfl
# Erstellt: 2017-07-28

def PyHellpWorld():
    return "Hello World"
Was muss ich machen, dass ich dieses Programm wie gewünscht aufrufen/ausführen kann.

Schön wäre es noch, wenn ich beim Aufruf Parameter übergeben könnte - z.B.

Code: Alles auswählen

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# Autor: StePfl
# Erstellt: 2017-07-28

def PyHellpWorld(Zusatz):
    return "Hello World" + Zusatz
schönes Wochenende und herzlichen Dank
StePfl
Zuletzt geändert von StePfl am Fr, 28.07.2017 19:32, insgesamt 1-mal geändert.
StePfl
**
Beiträge: 47
Registriert: Mo, 04.07.2016 17:16

(gelöst) Re: python in Calc-Zelle als Function aufrufen

Beitrag von StePfl »

nach einigem Suchen bin ich inzwischen hier https://forum.openoffice.org/en/forum/ ... 45&t=73145 fündig geworden.

Meine (teilweise funktionierende) Lösung sieht wie folgt aus:

ich habe im Verzeichnis "/home/XXXX/.config/libreoffice/4/user/Scripts/python" die Python-Datei "PyMakros.py" mit folgendem Inhalt angelegt:

Code: Alles auswählen

import re
def SearchStructure(SuchStr, text, StartPos):
    hlp = re.search(SuchStr, text[StartPos:])
    if hlp == None:
        return "",0,0
    return hlp.group(), hlp.start(), hlp.end()

Dann habe ich ein neues Colc-File angelegt und dort im Basic-Makro-Bereich folgendes hinterlegt:
(in Anlehnung an diese Quelle: https://forum.openoffice.org/en/forum/ ... 45&t=73145)

Code: Alles auswählen

REM  *****  BASIC  *****

REM Keep a global reference to the ScriptProvider, since this stuff may be called many times:
Global g_MasterScriptProvider

REM Specify location of Python script providing the cell functions:
Const URL_Main = "vnd.sun.star.script:calculadorra.py$"
Const URL_Args = "?language=Python&location=user"


Function getMasterScriptProvider()
   if NOT isObject(g_MasterScriptProvider) then
      oMasterScriptProviderFactory = createUnoService("com.sun.star.script.provider.MasterScriptProviderFactory")
      g_MasterScriptProvider = oMasterScriptProviderFactory.createScriptProvider("")
   endif
   getMasterScriptProvider = g_MasterScriptProvider
End Function


Function PySuchenStr(sSuchen,sText, Optional StartPos)
   sURL = URL_Main & "SearchStructure" & URL_Args
   oMSP = getMasterScriptProvider()
   oScript = oMSP.getScript(sURL)
   if ismissing(StartPos) then StartPos = 1
   x = oScript.invoke(Array(cstr(sSuchen),cstr(sText),StartPos),Array(),Array()) 
   PySuchenStr = x(0)
End Function


Function PySuchenStartPos(sSuchen,sText)
   sURL = URL_Main & "SearchStructure" & URL_Args
   oMSP = getMasterScriptProvider()
   oScript = oMSP.getScript(sURL)
   if ismissing(Anzahl) then Anzahl = 1
   x = oScript.invoke(Array(sSuchen,sText),Array(),Array())
   PySuchenStartPos = x(1)
End Function


Function PySuchenEndPos(sSuchen,sText)
   sURL = URL_Main & "SearchStructure" & URL_Args
   oMSP = getMasterScriptProvider()
   oScript = oMSP.getScript(sURL)
   if ismissing(Anzahl) then Anzahl = 1
   x = oScript.invoke(Array(sSuchen,sText),Array(),Array())
   PySuchenEndPos = x(2)
End Function
In "Tabelle1.A1" steht der TestText:"aiujbionsföil 21.12.2017 öiugnbnasdug"
in "Tabelle1.A2" steht der SuchString:"[0-9]{2}\.[0-9]{2}\.[0-9]{4}"
in "Tabelle1.A4" steht die Formel: "=PYSUCHENSTR(A2;A1)" :=>> 21.12.2017
oder:
in "Tabelle1.A4" steht die Formel: "=PYSUCHENSTR("[0-9]{4}";A1)" :=>> 2017

Ob diese Funktionalität auch als Funktionsaufruf in Basic (Fehlerfrei) klappt, muß ich erst noch testen.
Jedenfalls lassen sich jetzt auch sehr komplizierte Strukturen suchen
Ich bin erst einmal zufrieden!

Gruß und schönes Wochenend ...
StePfl

Edit: jetzt habe ich noch eine kleine Anpassung im Python-Code gemacht, dass auch das "NichtFinden" abgedeckt ist
StePfl
**
Beiträge: 47
Registriert: Mo, 04.07.2016 17:16

Re: [teilw. gelöst] python in Calc-Zelle als Function aufrufen

Beitrag von StePfl »

folgende SuchAusdrücke habe ich bisher ausprobiert:

Datum: "[0-9]{2}\.[0-9]{2}\.[0-9]{2,4} "
geschlossener Textblock (bis zum nächsten Leerzeichen): "\S+"
vierstellige Zahl: "[0-9]{4}"
siehe auch https://de.wikibooks.org/wiki/Python_un ... 9Cberblick

Gruß StePfl
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: [teilw. gelöst] python in Calc-Zelle als Function aufrufen

Beitrag von Toxitom »

Hallo StePfl,

ich denke mal, in dem Task geht es Dir generell darum, Python-Skripe als benutzerdefineirte Funktionen zu hinterlegen?

Denn Deine hier angesprochene Thematik kannst Du doch problemlos auch mit eingebauten Formeln direkt lösen:

Code: Alles auswählen

=TEIL(A1;SUCHEN(A2;A1);10)
liefert Dir exakt Deine Rückgabe... ohne Skripte;)

Du musst lediglich in den Optionen von Calc zulassen, dass reguläre Ausdrücke in Formeln verwendet werden dürfen.

Viele Grüße
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
StePfl
**
Beiträge: 47
Registriert: Mo, 04.07.2016 17:16

Re: [teilw. gelöst] python in Calc-Zelle als Function aufrufen

Beitrag von StePfl »

Hallo ToxiTom,

Danke für dein Hinweis. In den Tabellen hatte ich das schon verwendet (nach der Einstellung in den Optionen).
Mir ging es darum, in BASIC die Suchfunktion mit "regulären Ausdrücken" einsetzen zu können.
Wie ich die "Tabellenfunktion" in Basic einsetzen kann, hast du ja im anderen Thread aufgezeigt.

ABER: Die Möglichkeiten - nicht nur der "regulären Ausdrücke" - sind in Python deutlich vielfältiger ....
(z.B."\S+" für ganze, geschlossene Textblöcke) oder (einen Text rückwärts durchsuchen)

UND: man kann die Basic-Aufruf-Verbindungsfunktion für Python-Programme noch allgemeiner halten und so den Zugang zu einer Vielzahl von Funktionalitäten schaffen. Für eine Gestaltung einer direkten Verbindung zwischen LibreOffice und Python bin ich zu sehr Laie und die Beschreibungen für mich meistens zu hoch.

Für mich langt es vorläufig in dieser Form.

Viele Grüße
Stefan
Antworten