使用Python製作WORD報告

在前面一期文章使用Pandas、Jinja和WeasyPrint製作pdf報告中我分享瞭如何使用HTML模板來建立pdf報告的方法。
雖然pdf很不錯,但更多的人實際上在用微軟的WORD來操作文件。實際上對於使用者來說,建立所需的模板會更加簡單,該模板支援Word中所需的所有自定義格式,而不是嘗試使用HTML + CSS。 幸運的是,有一個庫支援在python中進行MS Word 郵件合併。 這種方法的優點是可以在任何系統上執行 - 即使沒有安裝Word。

背景

使所有這一切成為可能的包叫做docx-mailmerge。 它是一個成熟的包,可以解析MS Word docx檔案,找到合併欄位並將您需要的任何值填充給它們。 該包還支援一些輔助函式,用於填充表並生成具有多個分頁符的單個檔案。
我知道標準的Word方法是將此程序稱為mailmerge,但本文中的這個“mailmerge”可以是一個有用的模板系統,可以用於更復雜的解決方案,而不僅僅是填充文件中的名稱和地址

安裝

docx-mailmerge需要依賴lxml,所以需要先安裝lxml,再安裝 docx-mailmerge
pip install lxmlpip install docx-mailmerge

WORD合併欄位

為了使docx-mailmerge正常工作,您需要建立標準Word文件,並定義適當的合併欄位。 以下示例適用於Word 2016.其他版本的Word應該類似。 實際上花了我一段時間來弄清楚這個過程,但是一旦你做了幾次,這很簡單。
啟動Word並建立基本文件結構。 然後將游標放在應插入資料的位置,並選擇插入 - > 域
從“欄位”對話方塊中,從“欄位名稱”列表中選擇“MergeField”選項。 在“欄位名稱”中,輸入欄位所需的名稱。 在這種情況下,我們使用的是商業名稱。

單擊確定後,您應該在Word文件中看到類似這樣的內容:<< From >>。 您可以繼續建立包含所有必填欄位的文件。

簡單的合併

建立Word文件後,填充欄位值是一項很簡單的操作。
from

mailmerge

import

MailMerge

import

datetimetemplate

="PracticalPython.docx"

我們的PracticalPython.docx檔案可以看做是用來給大家群發新年祝福郵件模板。
下面我們先看看docx文件中有哪些合併欄位

document=MailMerge(template

)

print(document.get_merge_fields())

{'From', 'date', 'FromUserName', 'To', 'ToUserName'}
我們發現PracticalPython.docx文件中有我們上圖郵件模板中設計的幾個合併欄位,如From, date, FromUserName, To, ToUserName。下面我們對這幾個變數進行填充。
document.merge(From='123456dadeng@qq.com',FromUserName='大鄧',To='654321guanzhuzhe@qq.com',ToUserName='關注者的暱稱',date='{:%d-%b-%Y}'.format(datetime.date.today()

)

)

#輸出的docx檔案

document.write('output.docx')

這是簡單的Word文件填充效果

插入表格

生成模板時的另一個常見需求是有效地填充值表格中的值。 在我們的示例中,我們可以在包含客戶購買歷史的信件上附上展覽。 在完成模板時,我們不知道要包含多少行,並且每個欄位的填充將會非常快。 使用merge_rows可以使表格填充更容易。
在本部分構建模板,請建立一個包含1行的標準Word表,並將欄位插入相應的列中。 無需特殊格式。 它應該看起來像這樣:
現在我們定義了一連串的字典,用於填充到表格中去

document2=MailMerge('purchasehistory.docx'

)

sales_history=[{'prod_desc':'Red Shoes','price':'$10.00','quantity':'2500','total_purchases':'$25,000.00'},{'prod_desc':'Green Shirt','price':'$20.00','quantity':'10000','total_purchases':'$200,000.00'},{'prod_desc':'Purple belt','price':'$5.00','quantity':'5000','total_purchases':'$25,000.00'}

]

document2.merge_rows('prod_desc',sales_history

)

document2.write('output-table.docx')

最終結果是每行填充了我們需要的值,並保留了我們在模板文件中定義的預設表格式:
長按下方二維碼,後臺回覆“20190204”即可得到本專案程式碼。