########## 實例7:用Python操作Word批量生成合同 ################
'''
來源網上整理 ,供學習使用。
我們建立的模板和合同信息如下圖所示:這里有幾個注意事項:
1.Excel文檔中數字需要改成文本格式,不然像合同編號20190401在寫入到word時會變成20190401.0。至於怎么轉格式,請參考度娘:https://jingyan.baidu.com/article/ae97a646b3d0b7bbfc461d68.html
2.Excel中的公式需要去除,不然填到word中的信息是公式,而不是值。
3.Word模板中的“【....】”和Excel中的標題必須一一對應,且必須是全中文或全英文字符,因為python-docx會將中英混合的內容視為兩個及以上的格式(run),導致在替換的時候無法正確識別。
4.Word模板做好后,要用python-docx讀取一下,看看“【....】”是不是一個獨立的run,若不是,則需要從Excel標題欄中重新復制,覆蓋word模板中的“【....】”信息,已保證這一串字符是一個run。
'''
import docx #導入docx庫
from docx import Document
doc = Document("data/合同模板.docx") #打開word文件
for para in doc.paragraphs: #讀取word中的每個段落
for run in para.runs: #讀取每個段落中的不同格式(run)
print(run.text)
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
print(cell.text)
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
print(cell.text)
####################################
from docx import Document
import docx
def info_update(doc,old_info, new_info):
'''此函數用於批量替換合同中需要替換的信息
doc:合同模板
old_info和new_info:原文字和需要替換的新文字
'''
#讀取段落中的所有run,找到需替換的信息進行替換
for para in doc.paragraphs: #
for run in para.runs:
run.text = run.text.replace(old_info, new_info) #替換信息
#讀取表格中的所有單元格,找到需替換的信息進行替換
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
cell.text = cell.text.replace(old_info, new_info) #替換信息
from openpyxl import load_workbook #用於讀取Excel中的信息
wb = load_workbook('data/合同信息.xlsx')
ws = wb.active
doc = docx.Document("data/合同模板.docx")
for row in range(2, ws.max_row+1):
for col in range(1, ws.max_column+1):
#調用上面建立的函數,替換信息
info_update(doc,str(ws.cell(row=1,column=col).value), str(ws.cell(row=row,column=col).value))
doc.save("data/{}合同.docx".format(str(ws.cell(row=row,column=3).value)))
doc = docx.Document("data/合同模板.docx")
'''
調試后發下合同保存過程doc內容會變化,這就導致下次循環run與excle第一行不一致了,因此old_info不會被替換了,
所有合同都跟生成的第一份一樣,解決方法是在doc.save下一段加上“doc = docx.Document("data/合同模板.docx")“
把doc重置為模版
'''
print("{}合同完成".format(str(ws.cell(row=row,column=3).value)))
print("succed")
########### end ##############