python-docx讀取模板文檔并填充數(shù)據(jù)
簡(jiǎn)介
python-docx 是開(kāi)源的一個(gè) Python 庫(kù),用于讀取、創(chuàng)建和更新Microsoft Word 2007+(.docx)文件。目前最新版本是1.1.2。
官方文檔地址:python-docx.readthedocs.io/en/latest/
其開(kāi)源倉(cāng)庫(kù)地址:github.com/python-openxml/python-docx
準(zhǔn)備docx文檔
docx 文檔可以用 office 打開(kāi),也可以用 WPS,這邊截圖使用的是 WPS,因?yàn)槔锩驵]件合并部分 “插入合并域/Next域” 自帶的小書(shū)名號(hào)非常獨(dú)特,這個(gè)符號(hào)的正式名稱(chēng)是角引號(hào),主要用于法語(yǔ)、俄語(yǔ)、西班牙語(yǔ)等歐洲語(yǔ)言中,中文語(yǔ)境里使用較少,很適合作為后面遍歷行段內(nèi)容替換字符串時(shí)的標(biāo)識(shí)符。
在 “插入域” 彈窗的選項(xiàng)中選擇域名為 “唯一標(biāo)識(shí)符” 的選項(xiàng)插入,先前鼠標(biāo)定位的位置就會(huì)添加上這個(gè)小書(shū)名號(hào)包裹的 “唯一標(biāo)識(shí)符”。
只要插入了一個(gè)標(biāo)識(shí)符,剩下的就可以復(fù)制粘貼了。角引號(hào)里面的內(nèi)容也可以改成自己想要的字段名稱(chēng),中英文不限。
像下面的示例表格,便是直接從前面這個(gè)唯一標(biāo)識(shí)符復(fù)制過(guò)來(lái)的。復(fù)制時(shí)記得把角引號(hào)包裹住了。WPS里面鼠標(biāo)點(diǎn)擊標(biāo)識(shí)符時(shí)會(huì)自動(dòng)出現(xiàn)截圖中的深色區(qū)域,很方便檢查。
不過(guò)這個(gè)郵件合并域功能目前我只在 WPS 的 “引用” 模塊里有找到,在 office 的 Word 里沒(méi)有找到對(duì)應(yīng)的地方。雖然 “插入” 里可以選擇 “域”,但操作起來(lái)容易出錯(cuò),我自己就沒(méi)看懂應(yīng)該選哪個(gè)去插入……
python代碼
前面特地添加一個(gè)表格做示例,主要是因?yàn)楂@取文檔內(nèi)容時(shí),表格需要單獨(dú)的遍歷。
from docx import Document def merge_docx(doc, data): ''' 替換文檔里各個(gè)占位符,替換后保存 :param data: 數(shù)據(jù)data = { '這句話的英文': 'Hello World!','這句話的加粗版本': 'Hello World!' } :return: ''' # 遍歷文檔中的所有段落 for para in doc.paragraphs: # 替換每個(gè)自定義合并域 for key, value in data.items(): if f"?{key}?" in para.text: para.text = para.text.replace(f"?{key}?", value) # 遍歷文檔中的所有表格,再遍歷單元格內(nèi)段落 for table in doc.tables: for row in table.rows: for cell in row.cells: cell_text = cell.paragraphs[0].text if cell_text[1:-1] in data.keys(): key = cell_text[1:-1] val = data[key] # cell.text.replace(f"?{key}?", data[key]) pa = cell.paragraphs[0] pa.clear() r = pa.add_run(val) r.bold = True # 加粗需要在run級(jí)別設(shè)置 data={ '這句話的英文': 'Hello World!','這句話的加粗版本': 'Hello World!' } doc=Document('test.docx') merge_docx(doc,data) doc.save('result.docx')
執(zhí)行完畢,文檔成功生成,里面的內(nèi)容也成功替換,如下圖:
docx轉(zhuǎn)pdf
有時(shí)候,文檔需要轉(zhuǎn)換成 PDF 格式,python-docx 缺少相應(yīng)的工具,因此只能尋求其他工具,比如 win32com,恰好,win32com 可以調(diào)用到辦公軟件里的 wdExportFormatPDF 方法,用來(lái)將文件導(dǎo)出成pdf。
這個(gè)方法在 office 和 WPS 里都有存在,WPS 的 WebOffice 文檔 可以做參考。
Office 官方的文檔也可以看看。
兩個(gè)軟件的可用方法還是有區(qū)別的,只是恰好在導(dǎo)出成PDF這方面是一致。體現(xiàn)在代碼中,最主要的便只剩下的調(diào)用的底層辦公軟件對(duì)象。
import win32com, pythoncom from win32com.client import constants, gencache def word2pdf(word_path): pdf_path = word_path.replace(".docx", ".pdf") pythoncom.CoInitialize() wc = win32com.client.constants # 下面這個(gè)地方,WPS 就用 kwps.application ,Office就用 word.application wps = gencache.EnsureDispatch("kwps.application") doc = wps.Documents.Open(word_path, ReadOnly=1) doc.SaveAs2(FileName=pdf_path, FileFormat=wc.wdExportFormatPDF) wps.Documents.Close(wc.wdDoNotSaveChanges) wps.Documents.Close() wps.Quit() word2pdf('result.docx')
執(zhí)行完畢,文件成功導(dǎo)出。任務(wù)完成。
到此這篇關(guān)于python-docx讀取模板文檔并填充數(shù)據(jù)的文章就介紹到這了,更多相關(guān)python-docx讀取模板文檔內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解鎖Python并發(fā)編程中多線程與多進(jìn)程的應(yīng)用
本文我們將先從基本概念開(kāi)始,然后通過(guò)詳細(xì)舉例探討每一種機(jī)制,特別關(guān)注多線程和多進(jìn)程的應(yīng)用,最后分享一些實(shí)戰(zhàn)經(jīng)驗(yàn)以及一種優(yōu)雅的編程技巧,希望對(duì)大家有所幫助2023-05-05Python一行代碼識(shí)別發(fā)票并保存Excel示例詳解
這篇文章主要為大家介紹了Python一行代碼識(shí)別發(fā)票并保存Excel示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Python實(shí)現(xiàn)準(zhǔn)確獲取PDF文件中的標(biāo)題
想要在PDF文件中,解析獲取全部的標(biāo)題,是一件比較麻煩的事情,這篇文章將介紹一種較為準(zhǔn)確的提取標(biāo)題的方式,感興趣的小伙伴可以了解一下2024-02-02Python return語(yǔ)句如何實(shí)現(xiàn)結(jié)果返回調(diào)用
這篇文章主要介紹了Python return語(yǔ)句如何實(shí)現(xiàn)結(jié)果返回調(diào)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10Python使用Pandas生成日?qǐng)?bào)的實(shí)現(xiàn)代碼
Pandas是Python中一個(gè)強(qiáng)大的數(shù)據(jù)處理庫(kù),它提供了許多功能強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)分析工具,在本文中,我們將介紹Pandas的基本概念和如何使用它生成一個(gè)包含今天到未來(lái)20個(gè)工作日的日期列表的Excel文件,需要的朋友可以參考下2023-11-11Python實(shí)現(xiàn)列表索引批量刪除的5種方法
這篇文章主要介紹了Python實(shí)現(xiàn)列表索引批量刪除的5種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Python3.5實(shí)現(xiàn)的三級(jí)菜單功能示例
這篇文章主要介紹了Python3.5實(shí)現(xiàn)的三級(jí)菜單功能,涉及Python針對(duì)json格式數(shù)據(jù)的讀取、遍歷、查找、判斷等相關(guān)操作技巧,需要的朋友可以參考下2019-03-03Python 常見(jiàn)加密操作的實(shí)現(xiàn)
這篇文章主要介紹了Python 常見(jiàn)加密操作的實(shí)現(xiàn),幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-03-03