Word Template with Python

相信在大家的工作生涯當中,在一般的辦公室中最常用到的三寶應該就是Word、Excel與PowerPoint吧?像我過去在金融業,常常相關文件與簽呈等內容都必須使用Word來處理格式,以符合老人們喜歡的八股模式,相當多是需要人工排版再複製貼上,不同部門中這種重複枯燥的工作的比重不同,通常比重高的部門的可取代性高且人員素質較低,我曾經看過一整個部門都在做這種工作......,從業人員的科技技能真的應該增加。

Python-docx-template

大家比較常看到的是python-doc,python-doc可以透過Python從零到一地建立並編寫一份Word文件,由上而下線性的建立起來,但不免的到時候某些東西還是需要人工調整,所以我必較少使用python-doc。

取而代之的是透過人工建立文件格式後,在Word文件中放入變數,到時候使用Python與Jinja2來渲染這份文件反而是更為方便直覺的,尤其像金融業有相當多既有格式的文件,這時候就不需要重新刻一個,只需要將相關參數的位置留好即可。

1. 安裝

pip install docxtpl

2. Word文件範本建立

首先我們先建立一個Word文件,並將你需要的格式先建立完成,之後我就會從這個版型做為模組帶入參數或延伸。

WarrantTemplate.docx

接下來就可以將我們要的變數利用Jinja2的語法插入,像是下圖中,利用兩組大括弧包起來,裡面放數變數名稱。

WarrantTemplate.docx

3. 撰寫與執行Python主程式

main.py
from docxtpl import DocxTemplate

doc  = DocxTemplate("WarrantTemplate.docx")

context = {'warrant_name': '888888',
           'underlying': '2330',
           'warrant_type': 'Call',
           'execution_type': 'European',
           'method': 'Cash Payment',
           'Duration': '10 months',
           'conversion_ratio': '10',
           'total_number': 1000000,
           'listing_date': '2023/10/01 ~ 2023/12/31'}

doc.render(context)
doc.save('Warrant01.docx')

執行以上程式後就可以看到在相對目錄下產生了一個Warrant01.docx的檔案,打開來看就是已經將變數導入Word文件後的成品了,是不是很簡單呢?

Warrant01.docx

補充:利用For迴圈建立多個表格

常常我們要輸出的東西絕對不止一個表格,而是可能從資料庫中抓取出來的一大堆參數,這時候就可以利用Jinja2的迴圈來一次產出多個表格。

WarrantTemplate.docx

可以看到在表格的上下多了幾行,我想要一次產生十次一樣內容的表格,就可以直接加上這幾行,實際使用上則可以建立一個dict丟回context,透過一層一層的拆解,就可以批次產生囉!

Warrant02.docx

實際狀況就像是這樣,是不是非常簡單且直覺呢?想查看完整的功能請自行查找python-docx-template官方文件

Last updated