Reportlap Zeilenumbruch in Tabelle

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
Mady
User
Beiträge: 7
Registriert: Mittwoch 17. Oktober 2018, 20:38

Ich hab eine generierte List, deren Textinhalt teilweise sehr lang sein kann und immer eine unterschiedliche Anzahl an items haben kann. Auch nach langem recherchieren habe ich keine für mich laufende Lösung finden können wie man einen Zeilenumbruch automatisch einfügt. Momentan läuft meine Tabelle einfach über die Seite herüber. Ich habe gefunden, dass ein einfügen des befehl Paragraph die gewünscht funktion herbeiführt, leider muss diese soweit ich verstanden habe für jedes item manuel eingefügt werden.
Ich wäre euch sehr dankbar um Hilfe für die die folgenden 2 Probleme:
1. Die Tabellenbreite der Seite anpassen --> also eine fixe Breite festlegen (z.T. ist sie bei wenig Inhalt nur so eine kleiner Fleck auf der Seite)
2. Wie kann man automatisch einen Zeilenumbruch für jedes item der liste hinzufügen. --> ich hatte überlegt dass man vielleicht jedes item durch eine Schleife mit Paragaph laufen lässt, bekomme dies aber leider nicht programmiert, bzw. bei mir ist dann Paragaph ein teil des string ...

Ich wäre euch unglaublich dankbar um Hilfe.

Anbei mein Code in gekürzter Fassung:

Code: Alles auswählen

from reportlab.lib.pagesizes import A4
from reportlab.lib.pagesizes import letter, cm
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import LongTable, TableStyle, BaseDocTemplate, Frame, PageTemplate
from reportlab.lib import colors
from reportlab.platypus import Paragraph, Table, TableStyle
########################################################################

def test():
    doc = BaseDocTemplate(
        "question.pdf",
        pagesize=A4,
        rightMargin=72,
        leftMargin=72,
        topMargin=50,
        bottomMargin=80,
        showBoundary=False)

elements = []
data = [['A', 'B', 'C', 'dddddddddddd', 'D'],
        ['00', '0dddddddddddddddddddddddddddddddddddd1', '02', 'fff', '04'],
        ['10', '11', '12', 'dfg', '14'],
        ['20', '21', '22', 'ddddddddddddddddddddddddddddddddddd dddddddddddddddddddd23', '24'],
        ]

t = LongTable(data)

tableStyle = [
    ('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black),
    ('BOX', (0, 0), (-1, -1), 0.25, colors.black),
]
t.setStyle(TableStyle(tableStyle))
elements.append(t)

styles = getSampleStyleSheet()
styleN = styles['Normal']


frame = Frame(doc.leftMargin, doc.bottomMargin, doc.width, doc.height - 2 * cm, id='normal')
template = PageTemplate(id='longtable', frames=frame)
doc.addPageTemplates([template])


doc.build(elements)


if __name__ == '__main__':
    test()`
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

die Fragestelleung ist ein bisschen wirr formuliert, IMHO... Sofern ich das richtig verstanden habe:

Die Tabellenbreite kannst du indirekt über die Splatenbreite festlegen. Für die Spaltenbreite kennt die `Table`Klasse von ReportLab das Parameter `colWidths`, siehe Seite 83 der aktuelle Doku.

Wie man einen Platypus-Paragraph in eine Tabelle einfügt steht auch in der Doku, siehe Seite 87. Was ReportLab nicht kann: seeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeehr lange Wort (sinnvoll) umbrechen, weil es ja keine automatische Silbentrennung gibt. Umgebrochen wird wenn an Leerstellen. Wenn das Wort mehr Buchstaben hat, also die Zelle breit ist, dann bleibt IMHO nur die Verkleinerung der Schrift.

Gruß, noisefloor
Mady
User
Beiträge: 7
Registriert: Mittwoch 17. Oktober 2018, 20:38

Danke für die schnelle Antwort. Leider war die Frag wirklich etwas schlecht formuliert, ich versuch es nochmal neu, da leider Seite 87 meine Frage nicht beantwortet.
Mein Text ist automatisch generiert (Im Code beispielhaft mit data angegeben). Sprich mir ist es nicht möglich vor jeden string in der Liste (String stell dabei den langen automatisch generierten text da) das Wort Paragraph zu schrieben. Gibt es noch eine andere Möglichkeit, dass trotzdem jeder string der List in die Zeilen mit einen Zeilenumbruch dargestellt wird ?
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Mady hat geschrieben: Dienstag 18. Dezember 2018, 09:25Sprich mir ist es nicht möglich vor jeden string in der Liste [...] das Wort Paragraph zu schrieben.
Äh. Ohne mich jetzt mit Reportlap auszukennen: wenn das die Lösung ist, warum ist es dir dann nicht möglich?
Oder anders: Was musst du denn an deinem oben genannten Code ändern, damit er wie gewünscht funktioniert?
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@Mady:
Sprich mir ist es nicht möglich vor jeden string in der Liste (String stell dabei den langen automatisch generierten text da) das Wort Paragraph zu schrieben.
Das Wort "Paragraph" davor schreiben ist ja auch keine Lösung. Du legst eine _Instanz_ der Klasse `Paragraph` aus dem reportlab.playtypus Modul an und übergibst den Text als Parameter.

Wenn deine Daten in einer Liste vorliegen iterierst du über die Liste, machst aus jedem Element eine Instanz von `Paragraph` und das fügst du in die Tabelle ein.

Gruß, noisefloor
Antworten