🍀 Das LibreOffice Forum braucht HEUTE Ihre Hilfe! 🍀
❤️ Spenden Sie jetzt und sichern Sie die Zukunft unseres LibreOffice-Forums ❤️
Ihre Spende hilft, die Community offen, werbefrei (bei Registrierung) und lebendig zu halten. Vielen lieben Dank!

🙏 DANKE >> << DANKE 🙏

>> Das LibreOffice-Forum lebt von Ihnen – und von vielen Experten, die freiwillig und kostenlos ihr Wissen teilen.<<
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

mit Python auf LO-eigene Funktionen verwenden?

Alles zur Programmierung im LibreOffice.
preklov
Beiträge: 19
Registriert: Fr 19. Jan 2018, 14:39

Re: mit Python auf LO-eigene Funktionen verwenden?

Beitrag von preklov » So 3. Nov 2024, 18:54

Auf alle Selektionsarten angewendet:

Code: Alles auswählen

sel = doc.CurrentSelection
count = 0
if sel.supportsService('com.sun.star.sheet.SheetCellRanges'):
    for s in sel:
        cellRange = s[:,:]
        count += int(fAccess.callFunction('COUNTBLANK', (cellRange,)))
else:
    cellRange = sel[:,:]
    count = int(fAccess.callFunction('COUNTBLANK', (cellRange,)))
Gibt es eine elegantere Lösung?
Schöne Grüße
Volker

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2704
Registriert: Fr 10. Dez 2010, 10:01

Re: mit Python auf LO-eigene Funktionen verwenden?

Beitrag von karolus » So 3. Nov 2024, 21:46

preklov hat geschrieben:
So 3. Nov 2024, 18:54
Auf alle Selektionsarten angewendet:

Code: Alles auswählen

sel = doc.CurrentSelection
count = 0
if sel.supportsService('com.sun.star.sheet.SheetCellRanges'):
    for s in sel:
        cellRange = s[:,:]
        count += int(fAccess.callFunction('COUNTBLANK', (cellRange,)))
else:
    cellRange = sel[:,:]
    count = int(fAccess.callFunction('COUNTBLANK', (cellRange,)))
Gibt es eine elegantere Lösung?
jep…statt FunctionAccess und CountBlank:

Code: Alles auswählen

sel = doc.getCurrentSelection()
sum( _.Rows.Count * _.Columns.Count
    for _ in sel.queryEmptyCells())
LO25.2.x.y debian 13(trixie) auf Raspberry5 8GB (64bit)
LO25.8.x.y flatpak debian 13(trixie) auf Raspberry5 8GB (64bit)

preklov
Beiträge: 19
Registriert: Fr 19. Jan 2018, 14:39

Re: mit Python auf LO-eigene Funktionen verwenden?

Beitrag von preklov » Mo 4. Nov 2024, 08:40

OK, danke.
Mir ging es aber um Funktionsverwendung. Countblank sollte nur als einfaches Beispiel dienen.
Schöne Grüße
Volker

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2704
Registriert: Fr 10. Dez 2010, 10:01

Re: mit Python auf LO-eigene Funktionen verwenden?

Beitrag von karolus » Mo 4. Nov 2024, 10:07

Code: Alles auswählen

doc = XSCRIPTCONTEXT.getDocument()
# »createUnoService« ist bereits anderswo definiert!
fa = createUnoService("com.sun.star.sheet.FunctionAccess") 
sel = doc.getCurrentSelection() # aktuell ??
try:
    result = sum( fa.callFunction('countblank', (cellrange,))
                 for cellrange in sel)
except TypeError:
    result = fa.callFunction('countblank', (sel[:,:],)) 

print(result)
LO25.2.x.y debian 13(trixie) auf Raspberry5 8GB (64bit)
LO25.8.x.y flatpak debian 13(trixie) auf Raspberry5 8GB (64bit)

preklov
Beiträge: 19
Registriert: Fr 19. Jan 2018, 14:39

Re: mit Python auf LO-eigene Funktionen verwenden?

Beitrag von preklov » Mo 4. Nov 2024, 10:56

Sehr schön. Das könnte auch dem OP gefallen.
Schöne Grüße
Volker

preklov
Beiträge: 19
Registriert: Fr 19. Jan 2018, 14:39

Re: mit Python auf LO-eigene Funktionen verwenden?

Beitrag von preklov » Mo 4. Nov 2024, 14:25

Ups. Ich habe es jetzt erst nachgeholt, mit der Selektion einer einzigen Zelle zu testen.
Error:
<class 'uno.com.sun.star.lang.IllegalArgumentException'>
Da ich kein Python-Experte bin, weiß ich nicht, wie man einen solchen Fehler abfangen kann.
Mir gelingt es nur mit "except Exception:".
Schöne Grüße
Volker

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2704
Registriert: Fr 10. Dez 2010, 10:01

Re: mit Python auf LO-eigene Funktionen verwenden?

Beitrag von karolus » Mo 4. Nov 2024, 14:58

Selektion einer einzigen Zelle zu testen.

Code: Alles auswählen

try:
    result = fa.callFunction('countblank', (sel[:,:],)) 
    
except TypeError:
     
    result = sum( fa.callFunction('countblank', (cellrange,))
                 for cellrange in sel)

print(result)
Zuletzt geändert von karolus am Mo 4. Nov 2024, 15:10, insgesamt 1-mal geändert.
LO25.2.x.y debian 13(trixie) auf Raspberry5 8GB (64bit)
LO25.8.x.y flatpak debian 13(trixie) auf Raspberry5 8GB (64bit)

preklov
Beiträge: 19
Registriert: Fr 19. Jan 2018, 14:39

Re: mit Python auf LO-eigene Funktionen verwenden?

Beitrag von preklov » Mo 4. Nov 2024, 15:10

IllegalArgumentException hatte ich schon getestet, wirft aber den Fehler
name 'IllegalArgumentException' is not defined
OK, ich sehe, dass du die Reihenfolge umgedreht hast:
Aber ist die ServiceSupport-Überprüfung vielleicht doch besser lesbar, zudem es auch nicht mehr Codezeilen sind?

Code: Alles auswählen

if sel.supportsService('com.sun.star.sheet.SheetCellRanges'):
    count = sum(fa.callFunction('countblank', (cellrange,)) for cellrange in sel)
else:
    count = fa.callFunction('COUNTBLANK', (sel[:,:],))
Schöne Grüße
Volker

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2704
Registriert: Fr 10. Dez 2010, 10:01

Re: mit Python auf LO-eigene Funktionen verwenden?

Beitrag von karolus » Mo 4. Nov 2024, 15:23

Ich hab oben nochmal einfach die try/except Blöcke vertauscht, aber wie vor der Änderung geht auch:

Code: Alles auswählen

from com.sun.star.lang import IllegalArgumentException

……
except (TypeError, IllegalArgumentException):
……
letzlich Geschmackssache, mir gefällt hier statt »Countblank« die Lösung per »queryEmptyCells()« besser.
LO25.2.x.y debian 13(trixie) auf Raspberry5 8GB (64bit)
LO25.8.x.y flatpak debian 13(trixie) auf Raspberry5 8GB (64bit)

preklov
Beiträge: 19
Registriert: Fr 19. Jan 2018, 14:39

Re: mit Python auf LO-eigene Funktionen verwenden?

Beitrag von preklov » Mo 4. Nov 2024, 15:53

Der Import ist mir gar nicht in den Sinn gekommen :oops:
Natürlich ist »queryEmptyCells()« besser. Mir ging es im Sinne des OP um einen fehlertoleranten Weg, ganz allgemein mit Calc-Funktionen umzugehen. Manchmal ist es doch die einfachere Lösung.
Schöne Grüße
Volker


An alle, die das LibreOffice-Forum gern nutzen:
Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das laufende.
Einfach per Kreditkarte oder PayPal. Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.



❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten