对于批量操作合同文件,逐个去比对替换文件,复制粘贴是个很费劲的事,于是乎有了python自动化批量操作的这种神器.
工具原料:
- openpyxl模块--用于操作excel文档
- python-docx模块--用于操作word文档
- python3.9
- office2007或更高版本
模块安装:
pip install openpyxl
pip install python-docx
模板文件及效果展示:
实现步骤解析:
-
word中设置替换关键字 首先得在word中指定需要替换的某些关键字,并加以特殊标注,如''【合同编号】'',加上括号以便程序识别和区分
-
excel中设置表头与word中的关键字一一对应 excel中必须设置与合同文档相对应的需要替换的列表名,且必须带上相同的括号如''【合同编号】'',否则替换时会造成麻烦
-
用python-docx读取word内容,此处输出的格式比较错乱,但不影响最终效果
from docx import Document
doc = Document('合同模板.docx') # 打开模板文档,文档与源码处于同一目录下
for para in doc.paragraphs:#paragraphs为文档段落集合,此处遍文档每个段落对象
for run in para.runs: #runs为一段连续的文本,遍历所有连续的文本对象
print(run.text) #text为闰对象的属性,输出对象中的文本
- 读取excel中的对应值
wb = load_workbook('合同信息.xlsx') # 打开填充内容的工作簿
ws = wb.active # 激活工作表
for row in range(2, ws.max_row + 1): # 2-->跳过标题行,ws.max_row+1包含到最后一行
doc = Document('合同模板.docx') # 打开模板文档
for col in range(1, ws.max_column + 1): # 遍历列数据,同理最大值+1
old_info = str(ws.cell(row=1, column=col).value) # 读取列标题
new_info = str(ws.cell(row=row, column=col).value) # 读取表格中的数据
info_update(doc, old_info, new_info) # 调用替换函数替换值
com_name = str(ws.cell(row=row, column=2).value) # 取出公司名称用于文件命名
doc.save(f'{com_name}合同.docx') # 用新名称存档
. 5. 替换word中的关键字
# 读取和替换文本
def info_update(doc, old_info, new_info):#doc,模板文件,old_info,word中的关键字,new_info,excel中要替换的内容
for para in doc.paragraphs:
for run in para.runs:
run.text = run.text.replace(old_info, new_info)#使用replace函数完成两者的替换
完整源码:
#!/usr/bin/env python
# coding=utf-8
'''
批量生成word合同
注意:excel表的表头必须和word中的替换标记字符一致
'''
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为具有相同样式的一段连续文本,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') # 打开填充内容的工作簿
ws = wb.active # 激活工作表
for row in range(2, ws.max_row + 1): # 2-->跳过标题行,ws.max_row+1包含到最后一行
doc = Document('合同模板.docx') # 打开模板文档
for col in range(1, ws.max_column + 1): # 遍历列数据,同理最大值+1
old_info = str(ws.cell(row=1, column=col).value) # 读取列标题
new_info = str(ws.cell(row=row, column=col).value) # 读取表格中的数据
info_update(doc, old_info, new_info) # 调用替换函数替换值
com_name = str(ws.cell(row=row, column=2).value) # 取出公司名称用于文件命名
doc.save(f'{com_name}合同.docx') # 用新名称存档
源码已上传码云,地址:批量生成合同