利用python自动更新合同签订审批表和合同授权委托书

查看 66|回复 6
作者:zhanzhuoyu1996   
[Python] 纯文本查看 复制代码
from openpyxl import load_workbook
from docx import Document
def update_excel(excel_path, updates):
    """
    更新Excel指定单元格内容
    :param excel_path: Excel文件路径(.xlsx格式)
    :param updates: 单元格更新列表,格式为[(工作表名, 单元格地址, 新值), ...]
    """
    try:
        # 加载工作簿(read_only=False允许写入)
        wb = load_workbook(excel_path)
        for sheet_name, cell_addr, new_value in updates:
            if sheet_name not in wb.sheetnames:
                print(f"警告:工作表{sheet_name}不存在,跳过该更新")
                continue
            ws = wb[sheet_name]
            # 写入新值(自动处理字符串/数字/日期等)
            ws[cell_addr] = new_value
        # 保存修改
        wb.save(excel_path)
        print(f"Excel文件{excel_path}更新完成!")
    except Exception as e:
        print(f"Excel更新失败:{str(e)}")
def update_word_preserve_format(word_path, replace_pairs):
    """
    保留格式替换Word文本(支持段落、表格)
    :param word_path: Word文件路径(.docx)
    :param replace_pairs: 替换对列表,格式为[(旧文本, 新文本), ...]
    """
    try:
        doc = Document(word_path)
        # 1. 替换段落文本
        for para in doc.paragraphs:
            for old_str, new_str in replace_pairs:
                replace_text_in_element(para, old_str, new_str)
        # 2. 替换表格文本(若有表格)
        for table in doc.tables:
            for row in table.rows:
                for cell in row.cells:
                    for old_str, new_str in replace_pairs:
                        replace_text_in_element(cell, old_str, new_str)
        # 保存修改(覆盖原文件,建议先备份)
        doc.save(word_path)
        print(f"Word更新完成(格式保留):{word_path}")
    except Exception as e:
        print(f"Word更新失败:{str(e)}")
def replace_text_in_element(element, old_str, new_str):
    """
    保留格式替换文本(针对不同Word元素做差异化处理)
    - Paragraph:处理其包含的Runs(保留格式)
    - Cell:处理其包含的Paragraphs
    """
    # 处理段落(Paragraph对象,包含多个Run)
    if hasattr(element, 'runs'):
        for run in element.runs:
            if old_str in run.text:
                run.text = run.text.replace(old_str, new_str)
    # 处理表格单元格(Cell对象,包含多个Paragraph)
    elif hasattr(element, 'paragraphs'):
        for para in element.paragraphs:
            replace_text_in_element(para, old_str, new_str)
    # 其他元素(如Table/Row,暂不处理)
    else:
        pass
if __name__ == "__main__":
    contract_party_b = ""
    contract_summary = ""
    contract_amount = ""
    contract_name = ""
    project_name = ""
    WORD_FILE = "G:\桌面\模板\合同授权委托书.docx"  # 例如:"docs/授权委托书.docx"
    # -------------------------- 用户需修改以下参数 --------------------------
    # Excel更新配置
    EXCEL_FILE = "G:\桌面\模板\管线监测合同签订审批单(最新).xlsx"  # 例如:"data/授权信息.xlsx"
    EXCEL_UPDATES = [
        ("Sheet2", "B2", project_name),  # (工作表名, 单元格, 新值)
        ("Sheet2", "D2", contract_name), ("Sheet2", "D3", contract_amount),("Sheet2", "D4", contract_party_b),
        ("Sheet2", "B5", contract_summary)# 可添加更多更新项
        # ...
    ]
    # Word替换配置
    OLD_PARTY_B = "合同乙方"  # 例如:"北京某某科技有限公司"
    NEW_PARTY_B = contract_party_b  # 例如:"上海某某贸易有限公司"
    OLD_CONTRACT_NAME = "合同名称"  # 例如:"软件使用授权委托书"
    NEW_CONTRACT_NAME = contract_name  # 例如:"硬件采购授权委托书"
    REPLACE_PAIRS = [
        (OLD_PARTY_B, NEW_PARTY_B),  # 替换乙方
        (OLD_CONTRACT_NAME, NEW_CONTRACT_NAME),  # 替换合同名称
    ]
    # ----------------------------------------------------------------------
    # 执行更新
    update_excel(EXCEL_FILE, EXCEL_UPDATES)
    update_word_preserve_format(WORD_FILE, REPLACE_PAIRS)

文本, 授权委托书

canghaisui   

谢谢分享,这个咋用哦?
wu1357924680   

这个很方便
pbf0613   

很实用!!
TangTonT   

这个我用的到,感谢分享。
kuaile999   

谢谢,学习了。能学到这段内容的代码十分感谢!
Dove702   

刚好需要,就在这里看到了。初次接触,学习摸索中。谢楼主分享。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部