Python Script in Calc sortiert Tabelle nicht

Hallo Welt,
in Calc möchte ich eine Tabelle mit Weinen nach Farbe, Land und Jahrgang von einem Python-Script sortieren lassen. Das Script läuft fehlerlos durch, sortiert wird aber nichts.

Hier ist die Tabelle:

1 r 2012 SP
2 r 2012 SP
3 r 2010 I
4 r 2022 USA
5 r 2022 USA
6 r 2012 SP
7 r 2012 SP
8 r 2013 SP
9 r 2012 SP
10 r 2024 SP
11 r 2012 SP
12 w 2012 SP
13 w 2012 SP
14 w 2020 D
15 r 2020 D
16 rosé 2022 USA
17 r 2022 USA

Hier ist das Script:

import uno
from loguru import logger

document = XSCRIPTCONTEXT.getDocument()

def sort_wein():

    sheet = document.CurrentController.ActiveSheet
    
    try:
        
        # Sort range
        sort_range = sheet.getCellRangeByPosition(0, 0, 3, 16)
        
        sort_desc = sort_range.createSortDescriptor()
        sort_fields = []
        
        # Key1: Farbe
        field1 = uno.createUnoStruct('com.sun.star.table.TableSortField')
        field1.Field = 1  
        field1.IsAscending = True
        field1.FieldType = 'ALPHANUMERIC'
        sort_fields.append(field1)
        
        # Key2: Land 
        field2 = uno.createUnoStruct('com.sun.star.table.TableSortField')
        field2.Field = 3
        field2.IsAscending = True
        field2.FieldType = 'ALPHANUMERIC'
        sort_fields.append(field2)
        
        # Key3: Jahr 
        field3 = uno.createUnoStruct('com.sun.star.table.TableSortField')
        field3.Field = 2
        field3.IsAscending = True
        field3.FieldType = 'NUMERIC'
        sort_fields.append(field3)
        
        for prop in sort_desc:
            if prop.Name == "SortFields":
                prop.Value = tuple(sort_fields)
            elif prop.Name == "ContainsHeader":
                prop.Value = False
        
        sort_range.sort(sort_desc)

       
    except Exception as e:
        logger.error(f"Error in sort_wein: {e}")

Wo ist der Fehler?

Anbei sind Script und Tabelle (sort_wein.ods)
sort_wein.ods (12.2 KB)

Vielen Dank für Eure Kommentare!

Was ist falsch am normalen Sortier-Dialog? Wenn Du für die Liste einen Namen erstellst mit Daten>Bereich festlegen ..., werden die Sortierungseinstellungen für diesen Bereich gespeichert. Nachdem Du den Bereich um neue Daten erweitert hast, rufst Du nur noch Daten>Bereich aktualisieren auf.
Claude ist übrigens dumm wie Stroh, wenn es um LibreOffice geht.

1 Like

oha … welche KI hat das zusammengewürfelt…?!

from operator import itemgetter

def custom_sort(*_):
    doc = XSCRIPTCONTEXT.getDocument()
    sheet = doc.Sheets['Tabelle1']
    data = (cellrange:=sheet[ :17, :4]).DataArray
    cellrange.DataArray = sorted( data, key=itemgetter(1,3,2)) 

Danke Karolus!

Wieso kompliziert, wenn es auch einfach und elegant geht wie in Deinem Beispiel?

Um Deine Frage zu beantworten: ich habe Claude genutzt, um Excel VBA Makros zu übersetzen. Zusätzlich habe ich mich von dieser Seite leiten lassen.

Dir noch schöne Pfingsten!

Hallo
Es geht auch per API:

from com.sun.star.table import TableSortField as sf

def api_custom_sort(*_):
    doc = XSCRIPTCONTEXT.getDocument()
    sheet = doc.Sheets.Tabelle1
    cell_range = sheet[:17, :4]
    descriptor = cell_range.createSortDescriptor()    
    
    for entry in descriptor:
        if entry.Name == 'SortFields':
            entry.Value= ( sf(Field=1, IsAscending=True),
                           sf(Field=3, IsAscending=True),
                           sf(Field=2, IsAscending=True))
    cell_range.sort(descriptor)

Ich habe dies ebenso wie das andere Beispiel eingebaut und erhalte aber kein Ergebnis. Die Tabelle wird nicht sortiert, obwohl das Makro fehlerfrei ausgeführt wird.

Wenn ich danach das Skript mit der python-Funktion sorted benutze, klappt die Sortierung wieder.

Liegt das an meinem Software-Umfeld? Hier ist übrigens meine LO-Version:

Version: 26.2.3.2 (X86_64)
Build ID: 70e089b17412e4cb7773e41413306b17a2328c34
CPU threads: 16; OS: Windows 11 X86_64 (build 26200); UI render: Skia/Vulkan; VCL: win
Locale: de-DE (de_DE); UI: de-DE
Calc: threaded

Ich hab beide Versionen mit deiner Datei getestet, alle beide funktionieren!

Eigenartig. Bei mir klappt die API-Version weiterhin nicht. Ich werde es auf einer anderen Maschine ausprobieren und berichten. Allerdings bin ich erst Ende der Woche in der Lage, das zu tun.

Nochmals danke für Eure Kommentare.

Hallo
Sortiere mal per Sortierdialog mit den richtigen Einstellungen, mach das rückgängig, und teste danach die API-version.

das hat tatsächlich funktioniert. Doch was sagt Dir das?

Das sagt mir daß sich Calc die letzten Sortierparameter merkt, und einer davon vorher nicht so recht gepasst hat!

Um auf der sicheren Seite zu sein, müsstest du halt ALLE Parameter im Script explizit setzen.

OK, danke.

Ich habe übrigens die API-Version auf einem Linux-Rechner getestet mit demselben Ergebnis. API-Version zuerst: keine Sortierung. Sortierung per Hand, das rückgängig machen, dann API-Version: Sortierung.

Damit ist diese Frage endgültig geklärt. Vielen Dank noch einmal für Eure Hilfe.