How to Repeat Table Column Headings over Page Breaks in PDF output from ReportLab

前端 未结 5 1863
死守一世寂寞
死守一世寂寞 2021-02-07 06:42

I\'m using ReportLab to write tables in PDF documents and am very pleased with the results (despite not having a total grasp on flowables just yet).

However, I have not

相关标签:
5条回答
  • 2021-02-07 07:16

    This is the code I developed, after following Gordon's advice to reconsider using repeatRows, and it works!

    from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph, Frame, Spacer
    from reportlab.lib import colors
    from reportlab.lib.units import cm
    from reportlab.lib.pagesizes import A3, A4, landscape, portrait
    from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet
    from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY
    from reportlab.pdfgen import canvas
    
    pdfReportPages = "C:\\Temp\\test.pdf"
    doc = SimpleDocTemplate(pdfReportPages, pagesize=A4)
    
    # container for the "Flowable" objects
    elements = []
    styles=getSampleStyleSheet()
    styleN = styles["Normal"]
    
    # Make heading for each column and start data list
    column1Heading = "COLUMN ONE HEADING"
    column2Heading = "COLUMN TWO HEADING"
    # Assemble data for each column using simple loop to append it into data list
    data = [[column1Heading,column2Heading]]
    for i in range(1,100):
        data.append([str(i),str(i)])
    
    tableThatSplitsOverPages = Table(data, [6 * cm, 6 * cm], repeatRows=1)
    tableThatSplitsOverPages.hAlign = 'LEFT'
    tblStyle = TableStyle([('TEXTCOLOR',(0,0),(-1,-1),colors.black),
                           ('VALIGN',(0,0),(-1,-1),'TOP'),
                           ('LINEBELOW',(0,0),(-1,-1),1,colors.black),
                           ('BOX',(0,0),(-1,-1),1,colors.black),
                           ('BOX',(0,0),(0,-1),1,colors.black)])
    tblStyle.add('BACKGROUND',(0,0),(1,0),colors.lightblue)
    tblStyle.add('BACKGROUND',(0,1),(-1,-1),colors.white)
    tableThatSplitsOverPages.setStyle(tblStyle)
    elements.append(tableThatSplitsOverPages)
    
    doc.build(elements)
    
    0 讨论(0)
  • 2021-02-07 07:17

    Use the repeatRows=1 when you create the Table...

    from reportlab.platypus import Table 
    Table(data,repeatRows=1)
    

    I always like to have something you can cut & paste into a .py file to run and test. So here it is...

    import os
    import pandas as pd
    import numpy as np
    import reportlab.platypus 
    import reportlab.lib.styles
    from reportlab.lib import colors
    from reportlab.lib.units import mm
    from reportlab.lib.pagesizes import letter, landscape
    
    reportoutputfilepath = os.path.join('.\\test.pdf')
    
    pdf_file = reportlab.platypus.SimpleDocTemplate(
                                reportoutputfilepath,
                                pagesize=landscape(letter),
                                rightMargin=10,
                                leftMargin=10,
                                topMargin=38,
                                bottomMargin=23
                        )
    ts_tables = [
             ('ALIGN', (4,0), (-1,-1), 'RIGHT'),
             ('LINEBELOW', (0,0), (-1,0), 1, colors.purple),
             ('FONT', (0,0), (-1,0), 'Times-Bold'),
             ('LINEABOVE', (0,-1), (-1,-1), 1, colors.purple),
             ('FONT', (0,-1), (-1,-1), 'Times-Bold'),
             ('BACKGROUND',(1,1),(-2,-2),colors.white),
             ('TEXTCOLOR',(0,0),(1,-1),colors.black),
             ('FONTSIZE', (0,0),(-1,-1), 8), 
             ]
    
    df = pd.DataFrame(np.random.randint(0,1000,size=(1000, 4)), columns=list('ABCD'))
    lista = [df.columns[:,].values.astype(str).tolist()] + df.values.tolist()
    
    #Here is where you put repeatRows=1
    table = reportlab.platypus.Table(lista, colWidths=(20*mm, 20*mm, 20*mm, 20*mm),repeatRows=1)
    table_style = reportlab.platypus.TableStyle(ts_tables)
    table.setStyle(table_style)
    elements = []
    elements.append(table)
    
    # Build the PDF
    pdf_file.build(elements)
    print reportoutputfilepath
    
    0 讨论(0)
  • 2021-02-07 07:19

    I found this solution to repeat easily the header on a table which is on two pages. Add this line in your CSS for your table:

    -fs-table-paginate: paginate;

    I also found a class for FPDF which seems powerful (i don't need it for the moment, so I didn't test it)

    http://interpid.eu/fpdf-table

    0 讨论(0)
  • 2021-02-07 07:22

    t1 = Table(lista, colWidths=220, rowHeights=20, repeatRows=1) just type repeatRows=1

    0 讨论(0)
  • 2021-02-07 07:30

    From the documentation (yes, I know, but it's sometimes hard to locate this stuff in the manual):

    The repeatRows argument specifies the number of leading rows that should be repeated when the Table is asked to split itself.

    So when you create the table, this is one of the arguments you can pass, and it will turn the first n rows into header rows that repeat. You'll find this part of the text on page 77, but the section relating to creating a Table starts on page 76.

    http://www.reportlab.com/docs/reportlab-userguide.pdf

    0 讨论(0)
提交回复
热议问题