Python und ods Dateien

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DoPython
User
Beiträge: 7
Registriert: Donnerstag 9. November 2023, 11:40

Bei folgendem Programm sollen die Wörter in verschiedenen Farben dargestellt werden. Das funktioniert nicht. Mit einer Excel Datei funktioniert es. Woran kann es liegen. Ich nutze PyCharm. Odfpy ist installiert. Hier der Code:

Code: Alles auswählen

from odf.opendocument import OpenDocumentSpreadsheet
from odf.style import Style, TextProperties
from odf.table import Table, TableRow, TableCell
from odf.text import P

# Erstelle ein neues ODS-Dokument
doc = OpenDocumentSpreadsheet()

# Definiere einige Schriftarten, -größen und -farben für die Wörter
styles = [
    {"color": "#FF0000", "fontsize": "14pt", "fontfamily": "Arial"},
    {"color": "#00FF00", "fontsize": "16pt", "fontfamily": "Verdana"},
    {"color": "#0000FF", "fontsize": "18pt", "fontfamily": "Courier New"},
    {"color": "#FF00FF", "fontsize": "20pt", "fontfamily": "Times New Roman"},
    {"color": "#00FFFF", "fontsize": "22pt", "fontfamily": "Georgia"},
]

# Beispieltext
text = "Das ist ein Test Satz für eine ODS Datei"

# Erstelle eine Tabelle
table = Table()

# Erstelle eine Zeile in der Tabelle
tr = TableRow()

# Teile den Satz in Wörter auf
words = text.split()

# Weise jedem Wort eine andere Formatierung zu
for i, word in enumerate(words):
    # Erstelle eine neue Zelle
    tc = TableCell()

    # Wähle einen Stil für das Wort (wiederholt sich, falls es mehr Wörter als Stile gibt)
    style_props = styles[i % len(styles)]
    
    # Erstelle den Stil für das aktuelle Wort
    style = Style(name=f"style{i}", family="text")
    style.addElement(TextProperties(color=style_props["color"], fontsize=style_props["fontsize"], fontfamily=style_props["fontfamily"]))
    doc.styles.addElement(style)

    # Füge das Wort mit dem entsprechenden Stil in die Zelle ein
    p = P(text=word, stylename=style)
    tc.addElement(p)

    # Füge die Zelle der Zeile hinzu
    tr.addElement(tc)

# Füge die Zeile der Tabelle hinzu
table.addElement(tr)

# Füge die Tabelle dem Dokument hinzu
doc.spreadsheet.addElement(table)

# Speichere das Dokument
doc.save("test_document.ods")

print("Die Datei wurde erfolgreich erstellt.")
Sirius3
User
Beiträge: 18250
Registriert: Sonntag 21. Oktober 2012, 17:20

Du schreibst mit odfpy quasi rohes XML, da ist es kompliziert, herauszufinden, wie es korrekt geht, wenn man nicht passende Beispiele hat.
Styles müssen in automaticstyles registriert werden, funktionieren aber nicht direkt auf einem <p>-Element, sondern brauchen noch ein zusätzliches <span>.

Code: Alles auswählen

from itertools import cycle
from odf.opendocument import OpenDocumentSpreadsheet
from odf.style import Style, TextProperties
from odf.table import Table, TableRow, TableCell
from odf.text import P, Span

# Definiere einige Schriftarten, -größen und -farben für die Wörter
STYLES = [
    {"color": "#FF0000", "fontsize": "14pt", "fontfamily": "Arial"},
    {"color": "#00FF00", "fontsize": "16pt", "fontfamily": "Verdana"},
    {"color": "#0000FF", "fontsize": "18pt", "fontfamily": "Courier New"},
    {"color": "#FF00FF", "fontsize": "20pt", "fontfamily": "Times New Roman"},
    {"color": "#00FFFF", "fontsize": "22pt", "fontfamily": "Georgia"},
]


def main():
    # Erstelle ein neues ODS-Dokument
    doc = OpenDocumentSpreadsheet()

    # Beispieltext
    text = "Das ist ein Test Satz für eine ODS Datei"

    # Erstelle eine Tabelle
    table = Table()

    # Erstelle eine Zeile in der Tabelle
    tr = TableRow()

    # Teile den Satz in Wörter auf
    words = text.split()

    # Weise jedem Wort eine andere Formatierung zu
    for i, (style_props, word) in enumerate(zip(cycle(STYLES), words)):
        # Erstelle den Stil für das aktuelle Wort
        style = Style(name=f"style{i}", family="text")
        style.addElement(TextProperties(**style_props))
        doc.automaticstyles.addElement(style)

        # Erstelle eine neue Zelle
        tc = TableCell()

        # Füge das Wort mit dem entsprechenden Stil in die Zelle ein
        p = P()
        p.addElement(Span(text=word, stylename=f"style{i}"))
        tc.addElement(p)

        # Füge die Zelle der Zeile hinzu
        tr.addElement(tc)

    # Füge die Zeile der Tabelle hinzu
    table.addElement(tr)

    # Füge die Tabelle dem Dokument hinzu
    doc.spreadsheet.addElement(table)

    # Speichere das Dokument
    doc.save("test_document.ods")

    print("Die Datei wurde erfolgreich erstellt.")

if __name__ == "__main__":
    main()
DoPython
User
Beiträge: 7
Registriert: Donnerstag 9. November 2023, 11:40

Danke, nun funktioniert es. Ich hatte mir schon überlegt, das Format Excel zu nehmen und anschließend die Datei über Libre Office zu öffnen. Welche Variante ist einfacher umzusetzen?
Sirius3
User
Beiträge: 18250
Registriert: Sonntag 21. Oktober 2012, 17:20

Excel ist das verbreitetere Format, kommt halt drauf an, was Du machen möchtest.
Antworten