Python使用Reportlab处理PDF数据 - 表格
细节知识
简述
ReportLab有一个可爱的类,称为Table,可用于从数据中创建简单表和复杂表。 实际上也有一个LongTable类。 两者之间的主要区别在于LongTable是一个使用“贪心算法”来计算列宽的类,这使得创建长表的速度更快。 无论如何,Table对象的单元格可以容纳Python可以转换为字符串的任何内容,或者您可以插入ReportLab的Flowable甚至是上述Flowable的列表。
表格具有以下功能:
- 它们可以包含您可以转换成Python字符串的任何内容
- 它们可能包含可流通物,包括其他表格
- 如果您未提供明确的行高,则表格会计算出适合您数据的行高
- 从技术上讲,如果没有提供表格,表格也可以计算列的宽度,但是建议您提供宽度以加快绘图速度
- 表格可以分成几页,就像段落可以一样。 请参阅源代码中的canSplit属性。
- 您可以指定分割后应重复的行数。 当您希望在多个页面上重复标题时,这很有用。
- 有一个简单的“符号”可用于向表中添加阴影和网格线。 这样,即使您不知道实际显示多少行数据,也可以用不同的方式设置行格式
- 表格的样式及其数据是独立的,因此您可以创建自己的自定义样式,以应用于所有报告或其子集
- 表格样式可以继承其他样式
这是创建Table对象的方法:
Table(data, colWidths=None, rowHeights=None, style=None, splitByRow=1,
repeatRows=0, repeatCols=0, rowSplitRange=None, spaceBefore=None,
spaceAfter=None)
唯一需要的参数是要加载的数据。 但是,您也可以传入列宽(colWidths),行高(rowHeights),它们都是数字序列,通常是Python列表。 这些列表将代表列的宽度或行的高度。 您还可以将None传递给这些参数,这意味着表格将自行计算宽度和高度。
style参数是要应用于表的初始TableStyle(或带有适当命令的元组列表)。
splitByRow参数有点不寻常,因为您只需要对于太高和太宽以致无法容纳页面尺寸的表使用它。 在这种情况下,开发人员必须选择是希望将表向下“平铺”还是希望跨过然后再向下平铺。 此参数是布尔值,因此您可以将其传递0(假)或1(真)。 默认值为1。将其设置为1或True时,是在没有足够的空间绘制表的情况下,告诉表先按行进行拆分,然后再尝试按列进行拆分。 有趣的是,当前不支持按列拆分表,因此,如果碰巧尝试将其设置为False,则会收到NotImplementedError。
repeatRows参数告诉Table拆分表时应重复的前导行的数目或元组。 如果选择传递一个元组,则该元组需要指定应重复的行。
repeatCols参数不执行任何操作,因为未实现按表格拆分表格。
rowSplitRange参数用于控制将表拆分为仅行的一部分。 根据文档,您可以使用它来防止拆分发生在表格的开头或结尾附近。
最后,将spaceBefore和spaceAfter参数用作一种内置的Spacer。 它们允许您指定在表之前或之后要添加的额外空间量。
让我们创建一个简单的Table:
代码略
在这里,我们像往常一样创建一个模板对象和一个可流动列表。 然后,我们创建一个列表列表,将其用作加载到表中的数据。 *列表中的每个列表代表一行数据。 因此,当我们运行此代码时,表中应该有3行数据。 最后,我们通过传入数据结构来创建Table对象,将其添加到可流动列表中并构建文档。 当您运行此代码时,您应该得到以下结果:
很简单。 现在,让我们了解一下Table的方法。
Table方法
使用表格时使用的方法没有太多。 您可能会使用的主要工具如下:
- drawOn
- setStyle
- wrapOn
当您直接使用Canvas对象并且要将Table添加到Canvas中时,通常使用drawOn和wrapOn方法。 执行此操作时,如果要使用画布创建多页文档,则可能需要处理表格本身的拆分。 我认为这通常是个坏主意,因为您基本上只是在这里重新发明*。 只需在PLATYPUS中使用Table对象,您就会做得更好。
将样式应用于表
您将最常使用的实际方法是setStyle,因为几乎总是希望在Table上设置某种样式。 setStyle方法接受TableStyle对象或元组列表作为其唯一参数。 这是创建TableStyle的方法:
TableStyle(cmds=None, parent=None, **kw)
cmds参数只是一个元组列表,这些元组定义了要应用的单元格格式。 这是一个示例cmd元组:
('BACKGROUND', (0, 0), (-1, 0), colors.red)
元组中的第一个元素是单元格格式化命令。 在这种情况下,我们想将背景色应用于指定的单元格。 第二和第三个元素定义格式将应用于的单元格坐标。 坐标是(列,行),因此在此示例中,我们要应用从第0列第0行开始的背景色。第二组坐标中的-1告诉ReportLab我们希望格式扩展到所有列 从左到右。 当为单元格坐标使用负值时,基本上将从表的另一端开始倒数,这与在使用列表或字符串切片时使用负索引时完全相同。 因此,如果要将单元格格式从开始的列应用到从最后一列开始的单元格格式,则可以指定-2。
无论如何,当您告诉ReportLab将格式从(0,0)应用于(-1,0)时,您的意思是希望将格式应用于表格的整个第一行。 在此示例中,我们要向第一行添加红色背景色。 如果要对整个表应用格式,则可以说从(0,0)到(-1,-1),即从左上到右下。
最后一个元组元素是要应用于单元格格式化操作的颜色。
TableStyle类的父参数默认为None,但是您可以在此处传递TableStyle对象,新的TableStyle将从该对象继承。
让我们看一个小的可运行示例:
代码略
在这里,我们创建一个TableStyle,它将第一行的背景色设为红色。 我们传入的第二个命令是TEXTCOLOR,它将文本的颜色更改为我们指定的颜色。 在这种情况下,我们希望文本为蓝色。 我们还希望将其应用于第一列的第零列,一直到第一行。
如果运行此代码,则应该得到下表:
让我们了解一下我们可以对表格应用哪些其他类型的格式!
单元格格式化
您可以使用几个单元格格式化命令来格式化ReportLab中的表格:
其中的绝大多数通过它们的描述来解释,但是我确实想添加更多有关Background命令的信息。 实际上,它将从reportlab.lib.colors中获取ReportLab颜色,字符串名称或数字元组/列表。 如果您使用的是最后一个,则该元组必须包含以下信息:(DIRECTION,startColor,endColor)。 DIRECTION元素必须为VERTICAL或HORIZONTAL。 这会将颜色应用为渐变。
让我们看一个例子:
代码略
在这里,我们告诉表格在第一行应用样式。 该样式将水平应用,并且将是从红色开始到蓝色的渐变。 结果最终看起来像这样:
更改表格中的字体
详情参阅http://viadean.com/python_pdf_table.html
本文地址:https://blog.csdn.net/jiyotin/article/details/109234553
上一篇: 使用 Got包的一些体会
下一篇: python时间time模块处理大全