python reportlab 生成table學習筆記


利用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), 是定義范圍,前邊是上坐標,后邊是下坐標,每組坐標為(列,行)

image

 

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)

生成文件如下:

image

首行合並,對齊,沒有邊框:(從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)

 

結果為

image

加漢字

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)

 

最后結果

 

image

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM