阅读 20

python批量生成合同

对于批量操作合同文件,逐个去比对替换文件,复制粘贴是个很费劲的事,于是乎有了python自动化批量操作的这种神器.

工具原料:

  • openpyxl模块--用于操作excel文档
  • python-docx模块--用于操作word文档
  • python3.9
  • office2007或更高版本

模块安装:

pip install openpyxl
pip install python-docx
复制代码

模板文件及效果展示:

word模板

excel模板

最终效果图

实现步骤解析:

  1. word中设置替换关键字 首先得在word中指定需要替换的某些关键字,并加以特殊标注,如''【合同编号】'',加上括号以便程序识别和区分

  2. excel中设置表头与word中的关键字一一对应 excel中必须设置与合同文档相对应的需要替换的列表名,且必须带上相同的括号如''【合同编号】'',否则替换时会造成麻烦

  3. 用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为闰对象的属性,输出对象中的文本
复制代码
  1. 读取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')  # 用新名称存档
复制代码

源码已上传码云,地址:批量生成合同

文章分类
后端
文章标签