用 Python 生成 HTML 表格

郵件報表 之類的開發任務中,需要生成 HTML 表格。

使用 Python 生成 HTML 表格基本沒啥難度, for 循環遍歷一遍數據並輸出標籤即可。 如果需要實現合併單元格,或者按需調整表格樣式,就比較麻煩了。

這時,可以試試本文的主角 —— html-table 包,藉助它可生成各種樣式的 HTML 表格。 接下來,以一個簡單的例子演示 html-table 的常用用法:

表格效果圖

開始之前,須通過 pip 安裝 html-table 包:

$ python -m pip install html-table

安裝完畢後,即可導入 HTMLTable 類:

from HTMLTable import (
    HTMLTable,
)

創建一個新表格,標題爲 果園收成表

# 標題
table = HTMLTable(caption='果園收成表')

附上表頭:

# 表頭行
table.append_header_rows((
    ('名稱',    '產量 (噸)',    '環比',             ''),
    ('',        '',             '增長量 (噸)',      '增長率 (%)'),
))

注意到,表頭分爲兩行,有些單元格需要合併,被合併的單元格需要留空佔位。

合併單元格設置:

# 合併單元格
table[0][0].attr.rowspan = 2
table[0][1].attr.rowspan = 2
table[0][2].attr.colspan = 2

table[0] 取出第一行,即第一個 <tr> 標籤; table[0][0] 取出第一個單元格,對應 名稱table[0][0].attr 則是其標籤 <th> 的屬性。 該單元格合併下方一個單元格,需要將標籤屬性 rowspan 設置爲 2

接着,加入數據,方法與表頭類似,總共有 3 行:

# 數據行
table.append_data_rows((
    ('荔枝', 11, 1, 10),
    ('芒果', 9, -1, -10),
    ('香蕉', 6, 1, 20),
))

至此,數據準備完畢,可以着手調整樣式。先設置表格標題樣式:

# 標題樣式
table.caption.set_style({
    'font-size': '15px',
})

設置 <table> 標籤的樣式:

# 表格樣式,即<table>標籤樣式
table.set_style({
    'border-collapse': 'collapse',
    'word-break': 'keep-all',
    'white-space': 'nowrap',
    'font-size': '14px',
})

以上 CSS 樣式設置在 <table> 標籤上,作用於整個表格,影響表格邊框、字體大小等。 注意到,下面會覆蓋部分單元格(如表頭單元格)的字體大小。

接着,設置每個單元格的樣式,主要是規定邊框樣式:

# 統一設置所有單元格樣式,<td>或<th>
table.set_cell_style({
    'border-color': '#000',
    'border-width': '1px',
    'border-style': 'solid',
    'padding': '5px',
})

接着,設置表頭單元格樣式,規定顏色、字體大小、以及填充大小:

# 表頭樣式
table.set_header_row_style({
    'color': '#fff',
    'background-color': '#48a6fb',
    'font-size': '18px',
})

# 覆蓋表頭單元格字體樣式
table.set_header_cell_style({
    'padding': '15px',
})

set_header_row_style 將樣式設置到表頭兩個 <tr> 標籤上; set_header_cell_style 則將樣式設置到每個 <th> 標籤上。 應該儘量將顏色等樣式設置到 <tr> 標籤上,而不是 <th> 標籤上,以精簡生成的 HTML

將次級表頭字體大小調小,不再贅述:

# 調小次表頭字體大小
table[1].set_cell_style({
    'padding': '8px',
    'font-size': '15px',
})

遍歷每個數據行,如果第 2 個單元格值小於 0 ,設置樣式標紅背景顏色:

# 遍歷數據行,如果增長量爲負,標紅背景顏色
for row in table.iter_data_rows():
    if row[2].value < 0:
        row.set_style({
            'background-color': '#ffdddd',
        })

最後,生成 HTML 文本:

html = table.to_html()
print(html)

附錄

更多 Python 技術文章,請查看:Python語言小冊 ,轉至 原文 可獲得最佳閱讀體驗。

訂閱更新,獲取更多學習資料,請關注我們的 微信公衆號

小菜學編程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章