Seite 1 von 1

Python und ods Dateien

Verfasst: Montag 23. September 2024, 17:16
von DoPython
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.")

Re: Python und ods Dateien

Verfasst: Mittwoch 25. September 2024, 11:00
von Sirius3
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()

Re: Python und ods Dateien

Verfasst: Mittwoch 25. September 2024, 12:48
von DoPython
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?

Re: Python und ods Dateien

Verfasst: Mittwoch 25. September 2024, 14:21
von Sirius3
Excel ist das verbreitetere Format, kommt halt drauf an, was Du machen möchtest.