實(shí)際上對(duì)于用戶來(lái)說(shuō),創(chuàng)建所需的模板會(huì)更加簡(jiǎn)單骚腥,該模板支持Word中所需的所有自定義格式敦间,而不是嘗試使用HTML + CSS。幸運(yùn)的是束铭,有一個(gè)庫(kù)支持在python中進(jìn)行MS Word 郵件合并廓块。這種方法的優(yōu)點(diǎn)是可以在任何系統(tǒng)上運(yùn)行 - 即使沒(méi)有安裝Word。 背景使所有這一切成為可能的包叫做 docx-mailmerge
契沫。它是一個(gè)成熟的包带猴,可以解析MS Word docx文件,找到 合并字段
并將您需要的任何值填充給它們懈万。該包還支持一些輔助函數(shù)拴清,用于填充表并生成具有多個(gè)分頁(yè)符的單個(gè)文件。我知道標(biāo)準(zhǔn)的Word方法是將此進(jìn)程稱為 mailmerge
钞速,但本文中的這個(gè) “mailmerge”
可以是一個(gè)有用的模板系統(tǒng)贷掖,可以用于更復(fù)雜的解決方案,而不僅僅是填充文檔中的 名稱和地址
渴语。
安裝
docx-mailmerge
需要依賴 lxml
苹威,所以需要先安裝lxml,再安裝 docx-mailmerge
pip install lxmlpip
install docx-mailmerge
Word合并字段為了使docx-mailmerge正常工作驾凶,您需要?jiǎng)?chuàng)建標(biāo)準(zhǔn)Word文檔牙甫,并定義適當(dāng)?shù)?合并字段
掷酗。以下示例適用于Word 2016.其他版本的Word應(yīng)該類似。實(shí)際上花了我一段時(shí)間來(lái)弄清楚這個(gè)過(guò)程窟哺,但是一旦你做了幾次泻轰,這很簡(jiǎn)單。啟動(dòng)Word并創(chuàng)建基本文檔結(jié)構(gòu)且轨。然后將光標(biāo)放在應(yīng)插入 數(shù)據(jù)
的位置浮声,并選擇插入 - >文檔部件 - > 域
從“字段”對(duì)話框中旋奢,從“字段名稱”列表中選擇“MergeField”選項(xiàng)泳挥。在“字段名稱”中,輸入字段所需的名稱至朗。在這種情況下屉符,我們使用的是商業(yè)名稱。
單擊確定后锹引,您應(yīng)該在Word文檔中看到類似這樣的內(nèi)容:<< From >>矗钟。您可以繼續(xù)創(chuàng)建包含所有必填字段的文檔。
簡(jiǎn)單的合并
創(chuàng)建Word文檔后嫌变,填充字段值是一項(xiàng)很簡(jiǎn)單的操作吨艇。
from mailmerge import MailMerge
import datetime
template = "PracticalPython.docx"
我們的 PracticalPython.docx
文件可以看做是用來(lái)給大家發(fā)祝福郵件模板。
下面我們先看看docx文檔中有哪些合并字段
document = MailMerge(template)
print(document.get_merge_fields())
{'Date', 'FromUserName', 'From', 'To', 'ToUserName'}
我們發(fā)現(xiàn) PracticalPython.docx
文檔中有我們上圖郵件模板中設(shè)計(jì)的幾個(gè) 合并字段
,如 From, date, FromUserName, To, ToUserName
初澎。下面我們對(duì)這幾個(gè)變量進(jìn)行填充秸应。
document.merge(
From='1008611@qq.com',
FromUserName='羋小米',
To = '1101011@qq.com',
ToUserName='關(guān)注者的昵稱',
Date='{:%d-%b-%Y}'.format(datetime.date.today())
)
#輸出的docx文件
document.write('output.docx')
這是簡(jiǎn)單的Word文檔填充效果
插入表格生成模板時(shí)的另一個(gè)常見(jiàn)需求是有效地填充值表格中的值。在我們的示例中碑宴,我們可以在包含客戶購(gòu)買歷史的信件上附上展覽。在完成模板時(shí)桑谍,我們不知道要包含多少行延柠,并且 每個(gè)字段
的填充將會(huì)非常快锣披。使用merge_rows可以使表格填充更容易贞间。在本部分構(gòu)建模板,請(qǐng)創(chuàng)建一個(gè)包含1行的標(biāo)準(zhǔn)Word表雹仿,并將字段插入相應(yīng)的列中增热。無(wú)需特殊格式。它應(yīng)該看起來(lái)像這樣:
現(xiàn)在我們定義了一連串的字典胧辽,用于填充到表格中去
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')
最終結(jié)果是每行填充了我們需要的值峻仇,并保留了我們?cè)谀0逦臋n中定義的默認(rèn)表格式: