Reportlab表扩展到多个框架和页面

2024-04-19 16:38:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在Reportlab中创建一个简单的表,其中列出了学生姓名。但是,此表的行数超过100行,因此无法放在一页上。我正在寻找表格,当它变得太大而无法放在一页上时,将其拆分,然后继续放在第二页上,以此类推。我也在寻找“学生报告”:标题保持在每页的顶部

我使用了下面的代码,但是当我为大于一页的表运行代码时,它会无限期地运行。我希望有人能帮我解决这个问题

提前万分感谢,我真的很感激


import os
import pandas as pd
import numpy as np
from datetime import datetime as dt
from reportlab.pdfgen.canvas import Canvas
from reportlab.pdfgen import canvas
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib import colors
from reportlab.platypus import Paragraph, Frame, Table, TableStyle, Image, Spacer
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont

#Pull in Student Names
student_names = pd.read_csv("test_names.csv")

#Define table style
tblstyle = TableStyle([('INNERGRID', (0,0), (-1,-1), 0.25, colors.white),
                           ('BOX', (0,0), (-1,-1), 0.25, colors.white),
                           ('FONTSIZE', (0, 0), (-1, 0), 6),
                           ('FONTSIZE', (0, 1), (-1, -1), 6),
                           ('TEXTFONT', (0, 0), (-1, 0), 'Calibri-Bold'),
                           ('TEXTFONT', (0, 1), (0, -1), 'Calibri-Bold'),
                           ('TEXTFONT', (0, 1), (-1, -1), 'Calibri'),
                           ('TEXTCOLOR', (0, 0), (-1, 0), colors.white),
                           ('TEXTCOLOR', (1, 1), (0, -1), colors.black),
                           ('LEFTPADDING', (0, 0), (-1, -1), 1),
                           ('RIGHTPADDING', (0, 0), (-1, -1), 1),
                           ('TOPPADDING', (0, 0), (-1, -1), 0),
                           ('BOTTOMPADDING', (0, 0), (-1, -1), 0),
                           ('ROWBACKGROUNDS', (0, 0), (-1, -1), (colors.HexColor('#e8e9ec'), colors.HexColor('#CED1D6'))),
                           ('BACKGROUND', (0, 0), (-1, 0), colors.HexColor('#3A5675')),
                           ('ALIGN', (0, 0), (-1, 0), 'CENTER'),
                           ('ALIGN', (0, 1), (-1, -1), 'CENTER'),
                           ('VALIGN', (0, 0), (-1, -1), 'BOTTOM'),
                           ])

#Create a document
c = canvas.Canvas("student_list.pdf")
dtstring = dt.date.today().strftime("%B %d, %Y")

#create header on first page
c.drawString(55,750,"Student Report: "+dtstring)
c.line(50,740,530,740)

# turn datatable the table into a list of lists which is the format reportlab wants
data_summary = [pd.DataFrame(student_names).columns.values.tolist()] + pd.DataFrame(student_names).values.tolist()

# config the widths and heights of this specific table
colwidths_2 = [300] * len(data_summary)
rowheights_2 = [15] * len(data_summary)
    
# create table using the platypus Table object & set the style
tbl_summary = Table(data_summary,colwidths_2,rowheights_2,hAlign='LEFT', repeatRows=1)
tbl_summary.setStyle(tblstyle)

# Create frame empty story       
frame = Frame(50, 15, 500, 700, showBoundary=1)
story = []

story.append(tbl_summary)

for t in story:
    while frame.add(t, c) == 0:
        frame.split(t, c)
        frame = Frame(50, 15, 500, 700, showBoundary=1)

# save pdf
c.save()

os.startfile('student_list.pdf')

Tags: thefromimportdatanamesastablesummary
1条回答
网友
1楼 · 发布于 2024-04-19 16:38:45

我想你遇到的是画布是一个单独的页面。您需要使用文档模板,以便FlowTable在到达页面末尾时知道要做什么

。。。我没有Pandas或Numpy,所以我无法测试它,以及第一页的页眉&;间隔棒可能需要调整,但我认为您需要:

import os
import pandas as pd
import numpy as np
from datetime import datetime as dt
from reportlab.pdfgen.canvas import Canvas
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from reportlab.lib.units import inch
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib import colors
from reportlab.platypus import Paragraph, Frame, Table, TableStyle, Image, Spacer, SimpleDocTemplate
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont

# Pull in Student Names
student_names = pd.read_csv("test_names.csv")

# Define table style
tblstyle = TableStyle([('INNERGRID', (0, 0), (-1, -1), 0.25, colors.white),
                       ('BOX', (0, 0), (-1, -1), 0.25, colors.white),
                       ('FONTSIZE', (0, 0), (-1, 0), 6),
                       ('FONTSIZE', (0, 1), (-1, -1), 6),
                       ('TEXTFONT', (0, 0), (-1, 0), 'Calibri-Bold'),
                       ('TEXTFONT', (0, 1), (0, -1), 'Calibri-Bold'),
                       ('TEXTFONT', (0, 1), (-1, -1), 'Calibri'),
                       ('TEXTCOLOR', (0, 0), (-1, 0), colors.white),
                       ('TEXTCOLOR', (1, 1), (0, -1), colors.black),
                       ('LEFTPADDING', (0, 0), (-1, -1), 1),
                       ('RIGHTPADDING', (0, 0), (-1, -1), 1),
                       ('TOPPADDING', (0, 0), (-1, -1), 0),
                       ('BOTTOMPADDING', (0, 0), (-1, -1), 0),
                       ('ROWBACKGROUNDS', (0, 0), (-1, -1), (colors.HexColor('#e8e9ec'), colors.HexColor('#CED1D6'))),
                       ('BACKGROUND', (0, 0), (-1, 0), colors.HexColor('#3A5675')),
                       ('ALIGN', (0, 0), (-1, 0), 'CENTER'),
                       ('ALIGN', (0, 1), (-1, -1), 'CENTER'),
                       ('VALIGN', (0, 0), (-1, -1), 'BOTTOM'),
                       ])



# Create a document
c = canvas.Canvas("student_list.pdf")

# turn datatable the table into a list of lists which is the format reportlab wants
data_summary = [pd.DataFrame(student_names).columns.values.tolist()] + pd.DataFrame(student_names).values.tolist()

# config the widths and heights of this specific table
colwidths_2 = [300] * len(data_summary)
rowheights_2 = [15] * len(data_summary)

# create table using the platypus Table object & set the style
tbl_summary = Table(data_summary, colwidths_2, rowheights_2, hAlign='LEFT', repeatRows=1)
tbl_summary.setStyle(tblstyle)


# Build Story - Add a spacer at the beginning for your heading
story = [
    Spacer(1, 1 * inch)
]

story.append(tbl_summary)

# Create Page 1 Formatting
def myFirstPage(canvas: canvas.Canvas, doc):
    canvas.saveState()

    dtstring = dt.date.today().strftime("%B %d, %Y")

    # create header on first page
    canvas.drawString(55, 750, "Student Report: " + dtstring)
    canvas.line(50, 740, 530, 740)


# Use a Document Template so the flowable can flow to the next page.  
doc = SimpleDocTemplate(
    "student_list.pdf",
    pageSize=letter,
    rightMargin=0.5 * inch, leftMargin=0.5 * inch, topMargin=0.5 * inch, bottomMargin=0.5 * inch,
)

# Build and save
doc.build(story, onFirstPage=myFirstPage)


编辑:添加一个链接,指向跨多个页面布局的最佳答案: https://stackoverflow.com/a/39268987/5679079

相关问题 更多 >