應(yīng)用場(chǎng)景:
根據(jù)數(shù)據(jù)源不同,處理tem.docx模板文檔驹吮,輸出目標(biāo)result.docx文檔。注意這里介紹的方法不適用*.doc 文檔
開發(fā)環(huán)境:
1.windows7/windows10
2.Python3.6+ 64bit
3.擴(kuò)展模塊:python-docx
從擴(kuò)展模塊官方文檔描述來(lái)看DocxFactory似乎更符合我的需求,無(wú)奈我在win7和win10兩個(gè)環(huán)境里安裝都失敗沥匈,提示: Unable to find vcvarsall.bat,說(shuō)是需要Visual C++或者Visual Studio而我需要的版本分別為Visual C++ 14或者Visual Studio 2015忘渔,但是安裝之后并沒(méi)有解決問(wèn)題高帖。也曾嘗試在Centos7環(huán)境里安裝DocxFactory,仍然安裝失敗辨萍。所以只好放棄DocxFactory棋恼。
安裝擴(kuò)展模塊
pip install python-docx
或者
easy_install python-docx
關(guān)于python-docx的詳細(xì)信息返弹,請(qǐng)參閱官方文檔 http://python-docx.readthedocs.io/en/latest/
模板文檔
為了處理常用的文檔內(nèi)容,示例模板中包括普通的段落爪飘、表格义起、圖片、公式师崎。文檔內(nèi)容圖示默终,其中藍(lán)色字體為定義的參數(shù),輸出目標(biāo)文檔時(shí)會(huì)被動(dòng)態(tài)替換:
我想要的效果是文檔中的參數(shù)被替換成我想要的數(shù)據(jù)犁罩,文檔內(nèi)容格式保持齐蔽。
代碼內(nèi)容
模塊引入
import copy
import docx
import os
文檔處理代碼
def change_key(doc, new_doc, dic):
if dic and doc and new_doc:
doc_path = os.path.join(FILE_PATH, doc)
new_doc_path = os.path.join(NEW_FILE_PATH, new_doc)
doc_file = docx.Document(doc_path)
# 替換段落內(nèi)容
for paragraph in doc_file.paragraphs:
# 深度復(fù)制段落內(nèi)容,包括樣式床估。如果不深度復(fù)制含滴,樣式會(huì)丟失
list_runs = copy.deepcopy(paragraph.runs)
paragraph.clear()
#文字替換
for run in list_runs:
for name in dic:
print (name)
if name in run.text:
value = dic[name]
run.text = run.text.replace(name, str(value))
# 段落樣式的復(fù)制
paragraph.add_run(run.text, run.style)
# 替換表格內(nèi)容
for table in doc_file.tables:
# 深度復(fù)制表格內(nèi)容,包括樣式, 如果不深度復(fù)制丐巫,樣式會(huì)丟失
table_style = copy.deepcopy(table.style)
for row in table.rows:
for cell in row.cells:
for name in dic:
if name in cell.text:
value = dic[name]
cell.text = cell.text.replace(name, str(value))
table.style=table_style
doc_file.save(new_doc_path)
print(new_doc_path)
else:
return
測(cè)試代碼
value_dic = {
"module_name": "python-docx",
"bottom": "Sub_Bottom",
"subscript_top": "Sub_Top",
"rc_22": "TRC22",
"rc_24": "TRC24",
"rc_32": "TRC32",
"rc_34": "TRC34",
}
change_key("tem.docx", "result.docx", value_dic)
對(duì)于python-docx來(lái)說(shuō)文檔中的所有內(nèi)容都是段落谈况,其識(shí)別段落是根據(jù)文檔中的回車符來(lái)判斷的。而對(duì)于文檔中的公式或者圖片來(lái)說(shuō)递胧,python-docx處理起來(lái)會(huì)丟失碑韵。python-docx在解析docx文檔時(shí)首先會(huì)解壓文檔,公式和圖片都會(huì)被作為圖片來(lái)處理缎脾,存放入“..\word\media\”目錄下祝闻,所以僅僅簡(jiǎn)單的復(fù)制是會(huì)因找不到而丟失這些內(nèi)容。我在模板文檔中對(duì)公式與圖片作了特殊處理遗菠,即在公式與圖片外面加了一層表格联喘,表格邊框線設(shè)置為無(wú)邊框,視覺(jué)效果上與普通的公式舷蒲、圖片沒(méi)有什么區(qū)別耸袜,但卻方便了很多。
輸出效果
從輸出結(jié)果來(lái)看牲平,還有一些不盡如意的地方堤框,比如原文檔中參數(shù)由藍(lán)色標(biāo)注,輸出后纵柿,顏色消失蜈抓;原來(lái)的斜體效果也失去;表格中動(dòng)態(tài)寫入的內(nèi)容也是左對(duì)齊昂儒,而原模板是居中設(shè)置的沟使。
這里記錄了自己踩過(guò)的坑調(diào)填平后的內(nèi)容,至于會(huì)遇到什么樣的坑渊跋,你不防自制一個(gè)模板來(lái)試試腊嗡。