如何在ReportLab表格的中间单元格之间添加间距?
ReportLab表格添加单元格间距解决方案
问题描述
我希望在ReportLab生成的表格中间单元格之间添加间距,但未在官方文档中找到相关实现方法。我尝试了以下代码,但不确定是否需要拆分表格来达到预期效果。
from reportlab.lib.pagesizes import inch from reportlab.platypus import Table, SimpleDocTemplate from reportlab.lib import colors doc = SimpleDocTemplate("label.pdf", pagesize=(4 * inch, 6 * inch)) content = [] data= [ ['Name', 'John Week', 'NO. 1234'], ['5678', ' ', ' '], ['Aisle', '3' , ' '], ['Table', '2', ' '], ['Location', 'Continental', ' '], ['Units moved', '40', ' '], ['Units pending', '10', ' '], ['Total', '50', ' '], ['Number', '1 of 50', ' '], ] t=Table(data,colWidths=[1.2*inch,1.4*inch,0.8*inch],style=[ ('FONTSIZE', (0,0), (-1,-1), 7), ('ALIGN',(0,0),(-1,-1),'CENTER'), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('GRID',(1,2),(-2,-1),1,colors.black), ('BOX',(0,1),(0,1),1,colors.black), ('BOX',(2,0),(2,1),1,colors.black), ]) content.append(t) doc.build(content)
- 当前效果:表格中间的键值对单元格(如Aisle与3、Table与2等)紧密排列,无明显垂直间距
- 期望效果:中间列的每个键值对之间存在明显的垂直空隙,分隔开不同的条目
解决方案
不需要拆分表格,以下两种方法可以实现预期效果:
方法一:插入空白行设置间距
在数据列表中需要分隔的行之间插入空白行,然后通过rowHeights设置空白行的高度作为间距,同时只为有效数据行添加边框:
from reportlab.lib.pagesizes import inch from reportlab.platypus import Table, SimpleDocTemplate from reportlab.lib import colors doc = SimpleDocTemplate("label.pdf", pagesize=(4 * inch, 6 * inch)) content = [] data = [ ['Name', 'John Week', 'NO. 1234'], ['5678', ' ', ' '], ['Aisle', '3', ' '], ['', '', ''], # 空白行用于间距 ['Table', '2', ' '], ['', '', ''], # 空白行用于间距 ['Location', 'Continental', ' '], ['', '', ''], # 空白行用于间距 ['Units moved', '40', ' '], ['', '', ''], # 空白行用于间距 ['Units pending', '10', ' '], ['', '', ''], # 空白行用于间距 ['Total', '50', ' '], ['', '', ''], # 空白行用于间距 ['Number', '1 of 50', ' '], ] # 定义行高:前两行0.3英寸,每组数据行0.3英寸+空白行0.1英寸 row_heights = [0.3*inch] * 2 for _ in range(7): row_heights.extend([0.3*inch, 0.1*inch]) t = Table(data, colWidths=[1.2*inch, 1.4*inch, 0.8*inch], rowHeights=row_heights, style=[ ('FONTSIZE', (0,0), (-1,-1), 7), ('ALIGN',(0,0),(-1,-1),'CENTER'), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), # 只为有效数据行添加边框 ('GRID',(1,2),(-2,2),1,colors.black), ('GRID',(1,4),(-2,4),1,colors.black), ('GRID',(1,6),(-2,6),1,colors.black), ('GRID',(1,8),(-2,8),1,colors.black), ('GRID',(1,10),(-2,10),1,colors.black), ('GRID',(1,12),(-2,12),1,colors.black), ('GRID',(1,14),(-2,14),1,colors.black), ('BOX',(0,1),(0,1),1,colors.black), ('BOX',(2,0),(2,1),1,colors.black), ]) content.append(t) doc.build(content)
方法二:调整行高与边框样式
通过增大目标行的高度,仅绘制单元格的上下边框,利用行内空白区域模拟间距,无需添加额外行:
from reportlab.lib.pagesizes import inch from reportlab.platypus import Table, SimpleDocTemplate from reportlab.lib import colors doc = SimpleDocTemplate("label.pdf", pagesize=(4 * inch, 6 * inch)) content = [] data = [ ['Name', 'John Week', 'NO. 1234'], ['5678', ' ', ' '], ['Aisle', '3', ' '], ['Table', '2', ' '], ['Location', 'Continental', ' '], ['Units moved', '40', ' '], ['Units pending', '10', ' '], ['Total', '50', ' '], ['Number', '1 of 50', ' '], ] t = Table(data, colWidths=[1.2*inch, 1.4*inch, 0.8*inch], style=[ ('FONTSIZE', (0,0), (-1,-1), 7), ('ALIGN',(0,0),(-1,-1),'CENTER'), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), # 增大中间行的高度,预留间距 ('ROWHEIGHT', (0,2), (-1,8), 0.4*inch), # 仅绘制每个单元格的上下边框,左右边框不显示 ('LINEABOVE', (1,2), (-2,2), 1, colors.black), ('LINEBELOW', (1,2), (-2,2), 1, colors.black), ('LINEABOVE', (1,3), (-2,3), 1, colors.black), ('LINEBELOW', (1,3), (-2,3), 1, colors.black), ('LINEABOVE', (1,4), (-2,4), 1, colors.black), ('LINEBELOW', (1,4), (-2,4), 1, colors.black), ('LINEABOVE', (1,5), (-2,5), 1, colors.black), ('LINEBELOW', (1,5), (-2,5), 1, colors.black), ('LINEABOVE', (1,6), (-2,6), 1, colors.black), ('LINEBELOW', (1,6), (-2,6), 1, colors.black), ('LINEABOVE', (1,7), (-2,7), 1, colors.black), ('LINEBELOW', (1,7), (-2,7), 1, colors.black), ('LINEABOVE', (1,8), (-2,8), 1, colors.black), ('LINEBELOW', (1,8), (-2,8), 1, colors.black), ('BOX',(0,1),(0,1),1,colors.black), ('BOX',(2,0),(2,1),1,colors.black), ]) content.append(t) doc.build(content)
内容的提问来源于stack exchange,提问作者Manuel Cabrera
相关产品推荐
相关产品推荐

