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)

