• 办公自动化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 ##############

    因为不懂,所以要学; 因为平凡,所以努力。 因为有为,所以有位。 因为执着,所以精彩。
  • 相关阅读:
    perl 监控网站域名劫持
    OpenLayers访问Geoserver发布的地图
    基于OpenLayers的地图封装Javascript类定义
    Linux_正则表达式
    Linux_正则表达式
    帆软出品: 7点搞定制药企业数据分析系统开发需求
    帆软出品: 7点搞定制药企业数据分析系统开发需求
    Geoserver地图样式SLD资料收集
    GeoServer地图开发解决方案:地图数据处理篇
    Geoserver发布shapfile,中文字段乱码问题
  • 原文地址:https://www.cnblogs.com/quezesheng/p/13288279.html
Copyright © 2020-2023  润新知