如何在ReportLab中根据内容调整列宽?
我正在使用Python和ReportLab来生成PDF格式的报告。数据是从数据库中提取的,然后插入到表格里。这里有一段简单的代码:
from reportlab.lib import colors
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle
from reportlab.lib.units import inch
doc = SimpleDocTemplate("simple_table.pdf", pagesize=letter)
elements = []
data= [['00', '01', '02', '03', '04'],
['10', 'Here is large field retrieve from database', '12', '13', '14'],
['20', '21', '22', '23', '24'],
['30', '31', '32', 'Here is second value', '34']]
t=Table(data)
columnWidth = 1.9*inch;
for x in range(5):
t._argW[x]= cellWidth
elements.append(t)
doc.build(elements)
我遇到了三个问题:
- 一个单元格里的长数据会覆盖到同一行的其他单元格上。
- 当我手动增加列宽,比如设置
cellWidth = 2.9*inch;
时,页面就看不见了,也无法左右滚动。 - 我不知道怎么在一个单元格里添加数据,也就是说如果数据太大,应该怎么让它在同一个单元格里换行。
我该如何解决这些问题呢?
3 个回答
-1
你好,我在调整表格内容大小的时候也遇到了同样的问题,后来我找到了一个解决办法。这个办法可能会帮助你,解决你提到的三个问题。
from reportlab.lib import colors
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle
from reportlab.lib.units import inch
doc = SimpleDocTemplate("simple_table.pdf", pagesize=letter)
elements = []
data= [['00', '01', '02', '03', '04'],
['10', 'Here is large field retrieve from database', '12', '13', '14'],
['20', '21', '22', '23', '24'],
['30', '31', '32', 'Here is second value', '34']]
t=Table(data,colWidths=[1.9*inch]*5, rowHeights=[0.9*inch] *4)
#colWidth = size * number of columns
#rowHeights= size * number of rows
elements.append(t)
doc.build(elements)
1
今天我也遇到了同样的问题。我想找到一个方法,只调整一列的大小,因为这一列的内容长度和其他列差得很远,而让reportlab来帮我处理其他的事情。
这是我找到的解决办法:
Table(data, colWidths=[1.9*inch] + [None] * (len(data[0]) - 1))
这个代码只指定了第一列的大小。不过,你当然也可以很简单地把数字放在None
之间的任何地方。
10
首先,我建议你不要像你之前那样设置列的大小。你可以直接把 colWidths
这个参数传给 Table
,像这样:
Table(data, colWidths=[1.9*inch] * 5)
接下来说说你的问题。如果你不设置 colWidth
参数,reportlab 会自动为你处理这个问题,根据你的数据来调整列的间距。如果你不想这样,你可以像 Bertrand 说的那样,把你的数据放进 Paragraph
中。这里有一个修改过的代码示例:
from reportlab.lib import colors
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import inch
styles = getSampleStyleSheet()
doc = SimpleDocTemplate("simple_table.pdf", pagesize=letter)
elements = []
data= [['00', '01', '02', '03', '04'],
['10', Paragraph('Here is large field retrieve from database', styles['Normal']), '12', '13', '14'],
['20', '21', '22', '23', '24'],
['30', '31', '32', 'Here is second value', '34']]
t=Table(data)
elements.append(t)
doc.build(elements)
我想你会明白这个意思的。