對于批量操作合同文件,逐個去比對替換文件,復(fù)制粘貼是個很費(fèi)勁的事,于是乎有了python自動化批量操作的這種神器.
工具原料:
- openpyxl模塊--用于操作excel文檔
- python-docx模塊--用于操作word文檔
- python3.9
- office2007或更高版本
模塊安裝:
pip install openpyxl
pip install python-docx
模板文件及效果展示:
實(shí)現(xiàn)步驟解析:
word中設(shè)置替換關(guān)鍵字
首先得在word中指定需要替換的某些關(guān)鍵字,并加以特殊標(biāo)注,如''【合同編號】'',加上括號以便程序識別和區(qū)分excel中設(shè)置表頭與word中的關(guān)鍵字一一對應(yīng)
excel中必須設(shè)置與合同文檔相對應(yīng)的需要替換的列表名,且必須帶上相同的括號如''【合同編號】'',否則替換時會造成麻煩用python-docx讀取word內(nèi)容,此處輸出的格式比較錯亂,但不影響最終效果
from docx import Document
doc = Document('合同模板.docx') # 打開模板文檔,文檔與源碼處于同一目錄下
for para in doc.paragraphs:#paragraphs為文檔段落集合,此處遍文檔每個段落對象
for run in para.runs: #runs為一段連續(xù)的文本,遍歷所有連續(xù)的文本對象
print(run.text) #text為閏對象的屬性,輸出對象中的文本
- 讀取excel中的對應(yīng)值
wb = load_workbook('合同信息.xlsx') # 打開填充內(nèi)容的工作簿
ws = wb.active # 激活工作表
for row in range(2, ws.max_row + 1): # 2-->跳過標(biāo)題行,ws.max_row+1包含到最后一行
doc = Document('合同模板.docx') # 打開模板文檔
for col in range(1, ws.max_column + 1): # 遍歷列數(shù)據(jù),同理最大值+1
old_info = str(ws.cell(row=1, column=col).value) # 讀取列標(biāo)題
new_info = str(ws.cell(row=row, column=col).value) # 讀取表格中的數(shù)據(jù)
info_update(doc, old_info, new_info) # 調(diào)用替換函數(shù)替換值
com_name = str(ws.cell(row=row, column=2).value) # 取出公司名稱用于文件命名
doc.save(f'{com_name}合同.docx') # 用新名稱存檔
.
- 替換word中的關(guān)鍵字
# 讀取和替換文本
def info_update(doc, old_info, new_info):#doc,模板文件,old_info,word中的關(guān)鍵字,new_info,excel中要替換的內(nèi)容
for para in doc.paragraphs:
for run in para.runs:
run.text = run.text.replace(old_info, new_info)#使用replace函數(shù)完成兩者的替換
完整源碼:
#!/usr/bin/env python
# coding=utf-8
'''
批量生成word合同
注意:excel表的表頭必須和word中的替換標(biāo)記字符一致
'''
from openpyxl import load_workbook
from docx import Document
# 讀取和替換文本
def info_update(doc, old_info, new_info):
for para in doc.paragraphs: # paragraphs為文檔段落集合,paragraph代表一個段落
for run in para.runs: # run為具有相同樣式的一段連續(xù)文本,runs為run的集合
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)
wb = load_workbook('合同信息.xlsx') # 打開填充內(nèi)容的工作簿
ws = wb.active # 激活工作表
for row in range(2, ws.max_row + 1): # 2-->跳過標(biāo)題行,ws.max_row+1包含到最后一行
doc = Document('合同模板.docx') # 打開模板文檔
for col in range(1, ws.max_column + 1): # 遍歷列數(shù)據(jù),同理最大值+1
old_info = str(ws.cell(row=1, column=col).value) # 讀取列標(biāo)題
new_info = str(ws.cell(row=row, column=col).value) # 讀取表格中的數(shù)據(jù)
info_update(doc, old_info, new_info) # 調(diào)用替換函數(shù)替換值
com_name = str(ws.cell(row=row, column=2).value) # 取出公司名稱用于文件命名
doc.save(f'{com_name}合同.docx') # 用新名稱存檔
源碼已上傳碼云,地址:批量生成合同