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>
import ods in doc
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.
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.
- 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
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
- 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
Gruß, noisefloor
-
- 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
@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
-
- 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}')
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}')
Wenn man nur den ersten Eintrag anders behandeln will, dann zieht man diesen Fall aus der for-Schleife heraus:
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.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}')
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}')
-
- User
- Beiträge: 6
- Registriert: Mittwoch 27. Oktober 2021, 16:06
@Sirius3
Perfekt ich danke Dir. Funktioniert einwandfrei und ich habe wieder was gelernt
Perfekt ich danke Dir. Funktioniert einwandfrei und ich habe wieder was gelernt