办公自动化7_用Python操作Word批量生成合同

########## 实例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 ##############

因为不懂,所以要学; 因为平凡,所以努力。 因为有为,所以有位。 因为执着,所以精彩。
原文地址:https://www.cnblogs.com/quezesheng/p/13288279.html