首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Reportlab -表格扩展到多个框架和页面

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

Stack Overflow用户
提问于 2021-02-13 02:49:19
回答 1查看 347关注 0票数 1

我正尝试在Reportlab中创建一个简单的表,其中列出了学生的姓名。但是,此表的行长为100+,因此不能放在一页中。我正在寻找当表格变得太大而无法放在一页上时拆分,并在第二页上继续,依此类推。我还希望“学生报告:”标题留在每一页的顶部。

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

提前谢谢你一百万,我真的很感激!

代码语言:javascript
运行
复制
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')
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-19 11:05:08

我认为你遇到的是画布是一个单一的页面。您需要使用文档模板,以便flowable知道当它到达页面末尾时要做什么。

..。我没有Pandas或Numpy,所以我不能测试这个,而且第一页的页眉和间隔可能需要调整,但我认为你需要这样的东西:

代码语言:javascript
运行
复制
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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66177443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档