openpyxl插入分页符

本文介绍如何在使用Python3.9与openpyxl3.0.7进行Excel操作时正确插入分页符,包括加载工作簿、获取工作表及应用新的分页符插入方法。

最近在使用python3.9和openpyxl 3.0.7进行excel操作的时候,发现插入分页符老是报错,提示没有page_breaks属性,于是查看API手册,发现这里有了修改,新的插入分页符的方法为:

from openpyxl.worksheet.pagebreak import Break
import openpyxl

#加载文件
wb = openpyxl.load_workbook("wb.xlsx")
#获取sheet
sheet = wb.active

#其中i或者j为行号或者列号
sheet.row_breaks.append(Break(i))
sheet.col_breaks.append(Break(j))

 

import pandas as pd from docx import Document import win32com.client import os import pythoncom def replace_text_in_run(run, old_text, new_text): """替换run中的文本""" if old_text in run.text: run.text = run.text.replace(old_text, new_text) def fill_in_table(table, data_dict): """填充表格中的占位""" for row in table.rows: for cell in row.cells: for paragraph in cell.paragraphs: for run in paragraph.runs: for key, value in data_dict.items(): replace_text_in_run(run, key, str(value)) def fill_contract(excel_path, word_template_path, output_path, party_b_col="{{乙方}}"): df = pd.read_excel( excel_path, sheet_name="Sheet1", engine="openpyxl" ) # 校验Excel是否存在“乙方名字”列 if party_b_col not in df.columns: raise ValueError(f"Excel中未找到'{party_b_col}'列,请检查列名或修改party_b_col参数!") doc = Document(word_template_path) # 查找所有"安全生产教育培训证明"标题所在的段落索引 contract_sections = [] for i, para in enumerate(doc.paragraphs): if para.text.strip() == "安全生产教育培训证明": contract_sections.append(i) # 确保Excel行数、合同段落数一致 if len(df) != len(contract_sections): raise ValueError( f"Excel数据行数与Word合同段落数量不匹配!\n" f"Excel行数:{len(df)},Word合同段落数量:{len(contract_sections)}" ) party_b_names = [] for idx, row_data in df.iterrows(): party_b_name = str(row_data[party_b_col]).strip() if not party_b_name or party_b_name == "nan": raise ValueError(f"第{idx + 1}行数据的'{party_b_col}'为空,请补充数据!") party_b_names.append(party_b_name) # 确定当前合同段的起始和结束段落索引 start_para = contract_sections[idx] end_para = contract_sections[idx + 1] if idx < len(df) - 1 else len(doc.paragraphs) # 填充段落中的文本 for para in doc.paragraphs[start_para:end_para]: for run in para.runs: for col in df.columns: replace_text_in_run(run, col, str(row_data[col])) # 填充表格中的数据(如果存在表格) for table in doc.tables: # 简单判断表格是否在当前合同段范围内(可根据实际情况调整) # 这里假设每个合同段后紧跟一个表格,且表格属于该合同段 # 更精确的判断可根据表格位置与段落关系进行 table_data_dict = {col: str(row_data[col]) for col in df.columns} fill_in_table(table, table_data_dict) doc.save(output_path) print(f"合同填写完成!已保存至:{output_path}") print(f"提取到{len(party_b_names)}个乙方名字:{party_b_names}") return party_b_names if __name__ == "__main__": if not os.path.exists("年度"): os.mkdir("年度") # 参数配置 EXCEL_PATH = "年度数据.xlsx" WORD_TEMPLATE_PATH = "年度模板.docx" OUTPUT_PATH = "年度/填写完成年度.docx" PARTY_B_COLUMN = "{{乙方}}" try: party_b_list = fill_contract( excel_path=EXCEL_PATH, word_template_path=WORD_TEMPLATE_PATH, output_path=OUTPUT_PATH, party_b_col=PARTY_B_COLUMN ) if os.path.exists(OUTPUT_PATH): split_word_by_page_breaks( input_file=OUTPUT_PATH, party_b_names=party_b_list ) else: print(f"填充后的合同文件不存在:{OUTPUT_PATH}") except Exception as e: print(f"程序运行出错: {str(e)}") 怎么4页合同数据全部都是一行的数据,一页对应一行数据,且不重复
最新发布
10-12
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值