如何在ReportLab中根据内容调整列宽?

9 投票
3 回答
19440 浏览
提问于 2025-04-17 23:02

我正在使用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)

我遇到了三个问题:

  1. 一个单元格里的长数据会覆盖到同一行的其他单元格上。
  2. 当我手动增加列宽,比如设置 cellWidth = 2.9*inch; 时,页面就看不见了,也无法左右滚动。
  3. 我不知道怎么在一个单元格里添加数据,也就是说如果数据太大,应该怎么让它在同一个单元格里换行。

我该如何解决这些问题呢?

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)

我想你会明白这个意思的。

撰写回答