import ods in doc

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
mabosu2010
User
Beiträge: 6
Registriert: Mittwoch 27. Oktober 2021, 16:06

Hallo,
ich versuche verzweifelt eine vorher erstellte ods.datei in meine doc.datei einzufügen und hoffe
auf diesem Wege eine Antwort zu bekommen.
Edit: Mit txt und csv funktioniert dies reibungslos.
Folgender code:

import os
from docx import Document
from docx.shared import Inches

document = Document()
section = document.sections[0]
header = section.header # KOPFZEILE
paragraph = header.paragraphs[0]
paragraph.text = " "
paragraph.style = document.styles["Header"]

paragraph = document.add_paragraph('SIGNATUR', style='Intense Quote')
document.add_picture('C:/Kasse/vd/vd_links/signatur.png', width=Inches(6.6))

with open('C:/Kasse/vd/monitor.ods') as f: <---------folgendes Document wird nicht eingefügt.
for line in f:
document.add_paragraph(line)
document.add_page_break()

document.save('C:/Kasse/vd/conf.doc') # Speichern unter
os.startfile('C:/Kasse/vd/conf.doc') # Starten

Folgende Fehlermeldung wird eingeblendet:
Traceback (most recent call last):
File "C:\Users\kasse\PycharmProjects\gb_Tool\kurze.py", line 25, in <module>
for line in f:
File "C:\Users\kasse\AppData\Local\Programs\Python\Python39\lib\encodings\cp1252.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x90 in position 152: character maps to <undefined>
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

Was läßt Dich vermuten, dass man eine ods-Datei wie eine txt-Datei zeilenweise lesen könnte?
Du brauchst einen ods-Reader und mußt dann irgendwie den Inhalt richtig in docx-Aufrufe übersetzen.
Je nach dem, wie die ods-Datei aussieht, und was Du erreichen möchtest, wird das sehr kompliziert.

Warum hast Du eine ods-Datei?
Einfacher wäre es wahrscheinlich, per libreoffice die ods-Datei in docx umzuwandeln und dann die beiden Dateien zu mergen.
Benutzeravatar
noisefloor
User
Beiträge: 4196
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

hast du wirklich ein .doc? Das ist ein binäres Dateiformat. Oder doch docx, was XML-basiert ist?

ODS ist Dateiformat für Tabellenkalkulationen (z.B. LibreOffice Calc), das kannst du so oder so 1:1 ein ein Word- / Textdokument übernehmen.

Gruß, noisefloor
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

@noisefloor in der MS Welt geht das durchaus. OLE nennt sich das.
Benutzeravatar
noisefloor
User
Beiträge: 4196
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

@__deets__: das ist mir schon klar. Nur basierend auf dem Python Code ist das anscheinend nicht das, was der TE anstrebt.

Gruß, noisefloor
mabosu2010
User
Beiträge: 6
Registriert: Mittwoch 27. Oktober 2021, 16:06

Hallo und danke für eure Antworten.

@Sirius3
das habe ich mir schon gedacht und versucht es um zu konvertieren. Was aber wie du recht hast alles in eine Zeile schreibt.
Das es nicht einfach geht habe ich mir schon gedacht da ich jedes Feld wohl definieren muss.
@noisefloor
ja das macht er auch nachdem ich es um konvertiert habe in eine .csv. Er schreibt mir dennoch alles schön in eine Zeile.
ich werde wohl einen Ansatz brauchen bei dem ich einzelnen Felder in py einlese und in das Dokument Zeile für Zeile ausgebe.
die csv ist nicht so groß max 10 auf 10 Felder. sollte bestimmt machbar sein.
Aber wie ihr merkt bin ich kein Programmierer und muss meine Lösungen zusammenbasteln.

Danke für eure Ansätze
mabosu2010
User
Beiträge: 6
Registriert: Mittwoch 27. Oktober 2021, 16:06

Habe es nun so gelöst bekommen:


import csv
with open("C:/Kasse/vd/monitor.csv") as csvdatei:
csv_reader_object = csv.reader(csvdatei)

zeilennummer = 0
for row in csv_reader_object:

if zeilennummer == 0:
document.add_paragraph(f'Spaltennamen sind: {", ".join(row)}')
else:
document.add_paragraph(f'- Seriennummer: {row[0]} \n| IP-Adresse: {row[1]} \n| Raum: {row[2]} \n| BP-22: {row[3]} \n| BP-32: {row[4]} \n| Service: {row[5]} \n| Sonstiges: {row[6]}.')
zeilennummer += 1

document.add_paragraph(f'Anzahl Datensätze: {zeilennummer-1}')
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn man nur den ersten Eintrag anders behandeln will, dann zieht man diesen Fall aus der for-Schleife heraus:

Code: Alles auswählen

import csv
with open("C:/Kasse/vd/monitor.csv") as csvdatei:
    csv_reader = csv.reader(csvdatei)
    fieldnames = next(csv_reader)
    document.add_paragraph(f'Spaltennamen sind: {", ".join(fieldnames)}')
    for anzahl, row in enumerate(csv_reader, 1):
        document.add_paragraph(f'- Seriennummer: {row[0]} \n| IP-Adresse: {row[1]} \n| Raum: {row[2]} \n| BP-22: {row[3]} \n| BP-32: {row[4]} \n| Service: {row[5]} \n| Sonstiges: {row[6]}.')
    document.add_paragraph(f'Anzahl Datensätze: {anzahl}')
Hier hast Du aber eine Tabelle mit Überschriften, also ist DictReader das richtige. Dann spart man sich die explizite Angabe der Spaltennamen:

Code: Alles auswählen

import csv
with open("C:/Kasse/vd/monitor.csv") as csvdatei:
    csv_reader = csv.DictReader(csvdatei)
    document.add_paragraph(f'Spaltennamen sind: {", ".join(csv_reader.fieldnames)}')
    for anzahl, row in enumerate(csv_reader, 1):
        document.add_paragraph("- {}.".format(
            " \n| ".join(f"{column}: {value}" for column, value in row.items())
        ))
    document.add_paragraph(f'Anzahl Datensätze: {anzahl}')
mabosu2010
User
Beiträge: 6
Registriert: Mittwoch 27. Oktober 2021, 16:06

@Sirius3
Perfekt ich danke Dir. Funktioniert einwandfrei und ich habe wieder was gelernt
Antworten