🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 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: 2536
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())
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 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: 2536
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)
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 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: 2536
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.
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 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: 2536
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.
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 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 und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten