Seite 1 von 1

import ods in doc

Verfasst: Montag 10. Januar 2022, 20:30
von mabosu2010
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>

Re: import ods in doc

Verfasst: Montag 10. Januar 2022, 21:21
von Sirius3
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.

Re: import ods in doc

Verfasst: Dienstag 11. Januar 2022, 09:39
von noisefloor
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

Re: import ods in doc

Verfasst: Dienstag 11. Januar 2022, 09:59
von __deets__
@noisefloor in der MS Welt geht das durchaus. OLE nennt sich das.

Re: import ods in doc

Verfasst: Dienstag 11. Januar 2022, 10:12
von noisefloor
@__deets__: das ist mir schon klar. Nur basierend auf dem Python Code ist das anscheinend nicht das, was der TE anstrebt.

Gruß, noisefloor

Re: import ods in doc

Verfasst: Dienstag 11. Januar 2022, 11:22
von mabosu2010
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

Re: import ods in doc

Verfasst: Dienstag 11. Januar 2022, 12:32
von mabosu2010
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}')

Re: import ods in doc

Verfasst: Dienstag 11. Januar 2022, 13:05
von Sirius3
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}')

Re: import ods in doc

Verfasst: Dienstag 11. Januar 2022, 15:21
von mabosu2010
@Sirius3
Perfekt ich danke Dir. Funktioniert einwandfrei und ich habe wieder was gelernt