下面的代码创建了一个很好的测试表,其中包含99行数据和一个在每个分页符时重复出现的标题。该表非常窄,所以我试图弄清楚如何将其拆分,使其在第一页的左侧有第1-37行,第一页右侧有第38-74行,第二页左侧的第75-99行。我称之为“在一个页面上拆分一个表”,但我可能会有一个更好的名称,所以我希望我已经准确地描述了它。
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 = "COL ONE"
column2Heading = "COL TWO"
# 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(["Col 1 Row " + str(i),"Col 2 Row " + str(i)])
tableThatSplitsOverPages = Table(data, [2.5 * cm, 2.5 * 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 :(得分:2)
您需要使用PageTemplates通过创建具有多个框架的PageTemplate来实现此目的,该框架允许您指定在页面内绘制文档的内容区域。遗憾的是,这意味着放弃SimpleDocTemplate,而是使用BaseDocTemplate并提供您自己的PageTemplates(如果您需要,还可以提供其他内容)。
答案 1 :(得分:1)
如果您知道页面上的确切行数,则可以使用此功能模拟两列。这样,表格仍会自动流过多个页面,而您不必担心PageTemplates。
def columnize(data, interval):
ret = []
for i in range(0, len(data), interval * 2):
for j in range(min(interval, len(data) - i)):
ret.append(data[i + j] + (data[i + j + interval] if i + j + interval < len(data) else []))
return ret
在您的示例中使用:
data = columnize(data, 75)
tableThatSplitsOverPages = Table(data, [2.5 * cm, 2.5 * cm], repeatRows=1)