利用python report生成table表格,需要定义表格的数据,表格的样式,最后利用doc.build方法生成文件。
在reportlab中文手册中描述table方法:
Table 初始化
Table(
data,
colWidths=None,
rowHeights=None,
style=None,
splitByRow=1,
repeatRows=0,
repeatCols=0,
rowSplitRange=None,
spaceBefore=None,
spaceAfter=None,
)
参数data是单元格值的序列,每个单元格值都应该使用str函数转换为字符串值,或者应该是一个
Flowable 实例(如Paragraph)或此类实例的列表(或元组)。如果一个单元格值是一个 Flowable 或
Flowable 的列表,这些单元格必须有一个确定的宽度,或者包含的列必须有一个固定的宽度。单元
格值的第一行在 data[0] 中,也就是说,单元格值是按行顺序排列的。i, jth.单元格值在data[i][j]中。
单元格值中的新行字符'\n'被视为行分割字符,并在draw时用于将单元格格式化为行。
其他参数是相当明显的,colWidths 参数是一个数字序列,也可能是None,代表列的宽度。在
colWidths 中的元素数决定了表中的列数。值为None意味着相应的列宽应该自动计算。
参数 rowHeights 是一个数字序列,也可能是None,代表行的高度。rowHeights
中的元素数决定了表中的行数。值为None意味着相应的行高应该自动计算。
参数 style 可以是表的初始样式。
splitByRow 参数只适用于太高和太宽而无法适应当前上下文的表格。
在这种情况下,你必须决定是向下和横向 "平铺",还是横向然后向下。 这个参数是一个布尔值,表
示当当前绘图区域可用空间太小,而调用者希望Table进行分割时,Table应该先按行进行分割,再
按列进行分割。目前还没有实现按列分割Table,所以将splitByRow设置为False将导致NotImplem entedError。参数repeatRows指定了当Table被要求拆分时应该重复的前导行的数量或元组。如果它是一个元组
,它应该指定哪些前导行应该被重复;这允许表的第一次出现比后来的分割部分有更多的前导行。
目前,repeatCols参数被忽略,因为Table不能按列进行拆分。
当在platypus故事中重新编排时,spaceBefore 和 spaceAfter 参数
可以用来在表格之前或之后放置额外的空间。
rowSplitRange参数可以用来控制表的分割,将表分割成它的行的子集;这可以防止分割太接近表的
开始或结束。
Table.setStyle(tblStyle)
这个方法将类TableStyle(下面讨论)的一个特定实例应用到Table实例中。这是让tables以一种很好的
格式化方式出现的唯一方法。
对setStyle方法的连续使用以加法的方式应用这些样式。也就是说,后面的应用会覆盖前面重叠的应
用。
TableStyle(commandSequence)
创建方法以参数命令序列为例初始化TableStyle。
这个类是通过传递给它一个commands序列来创建的,每个 command
是一个元组,由它的第一个元素识别,它是一个字符串;command元组的其余元素代表命令的起始和停止单元格坐标,可能还有厚度和颜色等。
LIST_STYLE = TableStyle(
[('LINEABOVE', (0,0), (-1,0), 2, colors.green),
('LINEABOVE', (0,1), (-1,-1), 0.25, colors.black),
('LINEBELOW', (0,-1), (-1,-1), 2, colors.green),
('ALIGN', (1,1), (-1,-1), 'RIGHT')]
)
这里 (0,0), (-1,0), 是定义范围,前边是上坐标,后边是下坐标,每组坐标为(列,行)
from reportlab.platypus.tables import Table, TableStyle from reportlab.lib import colors from reportlab.lib.units import inch from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image, Table, TableStyle elements = [] data = [['00', '01', '02', '03', '04'], ['10', '11', '12', '13', '14'], ['20', '21', '22', '23', '24'], ['30', '31', '32', '33', '34']] t = Table(data,5*[0.4*inch], 4*[0.4*inch]) t.setStyle(TableStyle([ ('TEXTCOLOR',(0,0),(-1,-1),colors.green), ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black), ('BOX', (0,0), (-1,-1), 0.25, colors.black), ])) elements.append(t) doc = SimpleDocTemplate('TabDemo3.pdf') doc.build(elements)
生成文件如下:
首行合并,对齐,没有边框:(从0列1行开始加边框和内部的线,外边框改为0.5
from reportlab.platypus.tables import Table, TableStyle from reportlab.lib import colors from reportlab.lib.units import inch from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image, Table, TableStyle elements = [] data = [["Test Table",'', '', '', ''], ['10', '11', '12', '13', '14'], ['20', '21', '22', '23', '24'], ['30', '31', '32', '33', '34']] t = Table(data,5*[0.4*inch], 4*[0.4*inch]) t.setStyle(TableStyle([ ('TEXTCOLOR',(0,0),(-1,-1),colors.black),#设定单元格 ('SPAN',(0,0),(-1,0)),#合并单元格,合并首行 ('ALIGN', (0,0), (-1,0), 'CENTER'),#设定首行为居中对齐 ('INNERGRID', (0,1), (-1,-1), 0.25, colors.black), ('BOX', (0,1), (-1,-1), 0.5, colors.black), ])) elements.append(t) doc = SimpleDocTemplate('TableDemo1.pdf') doc.build(elements)
结果为
加汉字
from reportlab.platypus.tables import Table, TableStyle from reportlab.lib import colors from reportlab.lib.units import inch from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image, Table, TableStyle from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont #引入字体 pdfmetrics.registerFont(TTFont('SimSun','SimSun.ttf')) #注册字体 pdfmetrics.registerFont(TTFont('SIMLI','SIMLI.ttf')) #注册字体 pdfmetrics.registerFont(TTFont('SIMXING','SIMXING.ttf')) #注册字体 pdfmetrics.registerFont(TTFont('Times','Times.ttf')) #注册字体 elements = [] data = [["测试表格",'', '', '', ''], ['10', '11', '12', '13', '14'], ['20', '21', '22', '23', '24'], ['30', '31', '32', '33', '34']] t = Table(data,5*[0.4*inch], 4*[0.4*inch]) t.setStyle(TableStyle([ ('TEXTCOLOR',(0,0),(-1,-1),colors.black),#设定单元格 ('SPAN',(0,0),(-1,0)),#合并单元格,合并首行 ('ALIGN', (0,0), (-1,0), 'CENTER'),#设定首行为居中对齐 ("FONTNAME",(0,0), (-1,0), 'SimSun'), ('INNERGRID', (0,1), (-1,-1), 0.25, colors.black), ('BOX', (0,1), (-1,-1), 0.5, colors.black), ])) elements.append(t) doc = SimpleDocTemplate('TableDemo2.pdf') doc.build(elements)
最后结果