【发布时间】:2016-03-25 16:13:02
【问题描述】:
我是 ReportLab 页面模板的新手。我必须创建一个报告,其中有 2 个页面模板 - 第一页使用标题页模板,所有其他页面都有通用模板。报告必须将表格拆分为多个页面。在第一页上,表格必须显示在较宽的框架上,然后剩余的表格在其余页面上的较宽框架上显示。
表格在不同页面之间拆分时如何更改列宽和表格样式?
编辑:这里我放了一些成功拆分但在所有页面上保持表格宽度相同的代码
# ReportLab PDF Generation Library
from reportlab.pdfgen import canvas
from reportlab.lib.units import inch, cm
from reportlab.lib.pagesizes import letter, landscape
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import BaseDocTemplate, Frame, Paragraph, NextPageTemplate, PageBreak, PageTemplate, Spacer
from reportlab.platypus.tables import Table, TableStyle
# Constants
Font_Leading = 10
Word_Spacing = 0.0
Char_Spacing = 0.08
#global table
data= [['DATE', 'NAME', 'ITEM', 'AMOUNT', 'BALANCE'],
['01/12/15', 'William', 'ITEM1 RELATED STUFF', '365.00', '43.30']
# CONSIDER MANY MORE ITEMS HERE
# NUMBER FO ITMES VARYING IN WAY TO CAUSE 1 OR MORE PAGES
# 3RD COLUMN WILL HAVE DESCRIPTIVE ITEM
# WHICH WILL REPLACE WITH PARAGARPHS LATER ON
]
t=Table(data,repeatRows=1,
colWidths=[.7*inch, 1*inch, 2.4*inch, .8*inch, .8*inch])
#The top left cell is (0, 0) the bottom right is (-1, -1).
tStyle = TableStyle([
# All Cells
('FONTSIZE', (0,0), (-1,-1), 8),
('TOPPADDING', (0,0), (-1,-1), 0),
('BOTTOMPADDING', (0,0), (-1,-1), 0),
('VALIGN', (0,0), (-1,-1), 'TOP'),
('LEADING', (0,0), (-1,-1), 10),
# Top row
('BACKGROUND', (0,0), (-1,0), colors.maroon),
('TEXTCOLOR', (0,0), (-1,0), colors.white),
('ALIGN', (0,0), (-1,0), 'CENTRE'),
# 3RD and 4th column,
('ALIGN', (3,0), (4,-1), 'RIGHT'),
# Line commands
# All
('BOX',(0,0),(-1,-1),.5,colors.black),
# top row
('GRID',(0,0),(-1,0),.5,colors.black),
# all columns
('LINEBEFORE',(0,0),(-1,-1),.5,colors.black),
# last column
('LINEAFTER',(-1,0),(-1,-1),.5,colors.black),
# last row
('LINEBELOW',(0,-1),(-1,-1),.5,colors.black)])
t.setStyle(tStyle)
def othPg(c, doc):
t.colWidths = [.2*inch, .2*inch,4*inch, .2*inch, .2*inch]
tStyle.add('BACKGROUND',(0,0),(-1,-1),colors.lightblue)
x=1
def pgHdr(c, doc):
width,height = letter
c.saveState()
c.translate(.3 * inch, 0 * inch)
# STUFF RELATED TO 2 INCH STTIC HEADER FOR FIRST PAGE
c.restoreState()
def main():
pdf_file = 'stmt.pdf'
Elements = []
doc = BaseDocTemplate(pdf_file,
pagesize=letter,
leftMargin=.3*inch,
rightMargin= .1 * inch,
topMargin= .1 * inch,
bottomMargin=.3 * inch,
showBoundary=1)
#normal frame as for SimpleFlowDocument
frameT = Frame(doc.leftMargin + 2*inch, doc.bottomMargin, doc.width - 2.01*inch, doc.height - 4.1*inch, id='normal', showBoundary=0)
frameB = Frame(doc.leftMargin+2, doc.bottomMargin, 7.5*inch, 10*inch, id='small', showBoundary=1)
doc.addPageTemplates([PageTemplate(id='First',frames=frameT,onPage=pgHdr),
PageTemplate(id='Later',frames=frameB,onPage=othPg)
])
Elements.append(NextPageTemplate('Later'))
Elements.append(t)
doc.build(Elements)
if __name__ == "__main__":
sys.exit(main())
【问题讨论】: