我正在尝试创建一个包含7个cols的表。最后一列包含一个似乎会产生错误的长文本。当单元格超出页面大小时,它会抛出异常。
doc = SimpleDocTemplate(response, pagesize=A4, rightMargin=30,leftMargin=30, topMargin=30,bottomMargin=18)
doc.pagesize = landscape(A4)
elements = []
styles = getSampleStyleSheet()
cell_style = styles['BodyText']
cell_style.wordWrap = 1
cell_style.fontName = 'Courier'
cell_style.spaceBefore = 30
cell_style.spaceAfter = 30
title_style = styles['Title']
title_style.fontName = 'Courier'
title = Paragraph('Export Issue Tracker (%s)' % (date.today().isoformat()), title_style)
elements.append(title)
data2 = [[Paragraph(cell, cell_style) for cell in row] for row in data]
table = LongTable(data2, colWidths=(None, None, None, None, None, None, 50*mm))
table_style = TableStyle([('BOX', (0,0), (-1,-1), 0.25, colors.black),
('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
('FONTNAME',(0,0),(-1,-1),'Courier'),
('VALIGN',(0,0),(-1,-1),'TOP'),
('ALIGN',(0,0),(-1,0),'CENTER'),
('TEXTCOLOR',(0,0),(-1,0), colors.yellow),
('BACKGROUND', (0,0), (-1,0), colors.gray),
('FONTSIZE',(0,0),(-1,-1),50)] + color_style)
table.setStyle(table_style)
elements.append(table)
doc.build(elements)
但是我收到以下错误:
LayoutError at /issues/export_comments/
Flowable <LongTable@0x7F5AFBBB6560 35 rows x 7 cols(tallest row 2694)> with cell(0,0) containing
u'<Paragraph at 0x7f5afbcb7ef0>9'(769.88976378 x 4782), tallest cell 2694.0 points, too large on page 2 in frame 'normal'(769.88976378 x 535.275590551*) of template 'Later'
我已经看过许多关于如何使用KeepTogether,Spacer,LongTable的帖子,但不适用于我。
答案 0 :(得分:0)
通常可以通过将内容设置为可流动的段落格式(具有定义的段落样式)来解决此问题,否则文本将不知道是否应该换行。在很多情况下,表中的格式将与文本发生冲突。上面的问题是RL抛出错误,因为尚未告知如何处理溢出文本。注释中提到的带有收缩,KeepTogether的变通方法不适用于未格式化的文本,您首先需要将其转换为段落。
以我的经验,最简单的规则是表样式可以处理除段落以外的所有内容。
以下是可建立的通用解决方案。我看到@ sagar-gupta去年年底才在寻找这个老问题的答案。
from reportlab.lib.pagesizes import letter, A4, landscape
from reportlab.lib.enums import TA_JUSTIFY, TA_LEFT, TA_CENTER, TA_RIGHT
from reportlab.lib.styles import ParagraphStyle, StyleSheet1
from reportlab.lib import colors
from reportlab.platypus import Frame, PageTemplate, KeepInFrame, Paragraph
from reportlab.lib.units import cm
from reportlab.platypus import (Table, TableStyle, BaseDocTemplate)
########################################################################
def create_pdf():
"""
Create a pdf
"""
# Create a frame
text_frame = Frame(
x1=3.00 * cm, # From left
y1=1.5 * cm, # From bottom
height=19.60 * cm,
width=15.90 * cm,
leftPadding=0 * cm,
bottomPadding=0 * cm,
rightPadding=0 * cm,
topPadding=0 * cm,
showBoundary=1,
id='text_frame')
styles = StyleSheet1()
styles.add(ParagraphStyle(name='Breadpointlist_style',
alignment=TA_LEFT,
bulletFontSize=7,
bulletIndent=0,
endDots=None,
firstLineIndent=0,
fontSize=8,
justifyBreaks=0,
justifyLastLine=0,
leading=9.2,
leftIndent=11,
rightIndent=0,
spaceAfter=0,
spaceBefore=0,
textColor=colors.black,
wordWrap='LTR',
splitLongWords=True,
spaceShrinkage=0.05,
))
bps = ParagraphStyle('bps', parent=styles['Breadpointlist_style'])
# Create a table
test_table = []
data = []
for i in range(11, 1, -1):
column1data = Paragraph('Column_1 on row {i}', bps)
column2data = Paragraph('Column_last on row {i}', bps)
data.append(['1','1','1','1','1',column1data, column2data])
data_table = Table(data, 15.90 * cm / 7)
data_table.setStyle(TableStyle([
('ALIGN', (0, 0), (1, -1), 'RIGHT'),
('SIZE', (0, 0), (-1, -1), 7),
('LEADING', (0, 0), (-1, -1), 8.4),
('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
('TOPPADDING', (0, 0), (-1, -1), 2.6),
('BOTTOMPADDING', (0, 0), (-1, -1), 2.6),
('LINEBELOW', (0, 0), (-1, -1), 0.3, colors.gray),
]))
test_table.append(data_table)
test_table = KeepInFrame(0, 0, test_table, mode='shrink')
# Building the story
story = [test_table] # adding test_table table (alternative, story.add(test_table))
# Establish a document
doc = BaseDocTemplate("Example_output.pdf", pagesize=letter)
# Creating a page template
frontpage = PageTemplate(id='FrontPage',
frames=[text_frame]
)
# Adding the story to the template and template to the document
doc.addPageTemplates(frontpage)
# Building doc
doc.build(story)
# ----------------------------------------------------------------------
if __name__ == "__main__":
create_pdf() # Printing the pdf