Python实现拆分合并Excel单元格并自动填充原左上角数据
日常工作中处理Excel报表经常遇到合并单元格问题:
- 合并单元格导出数据后,只有左上角有数值,其余空白,做统计、匹配时会缺失数据;
- 手动拆分合并单元格后,需要复制左上角值填充整段区域,表格量大时重复操作效率极低;
- 拆分后单元格样式错乱,字体、对齐、边框需要手动重新调整。
本文基于openpyxl实现一套通用工具函数:自动读取Excel所有合并区域,拆分单元格后将原合并区域全部填充左上角原值,同时同步复制字体、边框、填充色、对齐等单元格样式,无需手动二次美化,完美适配财务、生产、统计类报表。
一、工具优势
- 提前缓存全部合并区域,避免拆分后丢失合并范围信息;
- 拆分后整块区域统一填充左上角原始数值;
- 完整复制原单元格样式,表格视觉无变化;
- 支持自定义工作表、自定义输出路径,可覆盖原文件或生成新文件;
- 纯本地处理,无需依赖在线表格API,Windows/macOS通用。
二、环境依赖
仅需安装openpyxl库,用于读写.xlsx格式Excel文件:
pip install openpyxl
三、完整可运行代码
from openpyxl import load_workbook
from copy import copy
def unmerge_merged_cells_fill_all(file_path, sheet_name="Sheet1", output_path=None):
"""
Excel拆分合并单元格,拆分后原合并区域的所有单元格全部填充原左上角的值
:param file_path: str 输入Excel文件完整路径
:param sheet_name: str 目标工作表名称,默认Sheet1
:param output_path: str 输出文件路径,不传则直接覆盖原文件
:return: str 处理完成后的文件路径
"""
# 1. 加载工作簿,保留表格原有全部格式样式
wb = load_workbook(file_path)
ws = wb[sheet_name]
# 2. 提前读取所有合并单元格区域(关键:拆分后无法获取合并范围,必须先缓存)
merged_ranges = list(ws.merged_cells.ranges)
if not merged_ranges:
print("当前工作表未检测到任何合并单元格,无需执行处理")
return
# 3. 循环处理每一块合并区域
for m_range in merged_ranges:
# 获取合并区域边界:起始行、结束行、起始列、结束列
min_row = m_range.min_row
max_row = m_range.max_row
min_col = m_range.min_col
max_col = m_range.max_col
# 获取合并区域左上角单元格与原始数值
top_left_cell = ws.cell(row=min_row, column=min_col)
top_left_value = top_left_cell.value
# 拆分当前合并单元格
ws.unmerge_cells(range_string=str(m_range))
# 遍历原合并区域内所有单元格,统一填充左上角值并复制样式
for row in range(min_row, max_row + 1):
for col in range(min_col, max_col + 1):
current_cell = ws.cell(row=row, column=col)
# 填充数值
current_cell.value = top_left_value
# 复制左上角单元格全套样式,保证表格美观不混乱
current_cell.font = copy(top_left_cell.font)
current_cell.fill = copy(top_left_cell.fill)
current_cell.border = copy(top_left_cell.border)
current_cell.alignment = copy(top_left_cell.alignment)
current_cell.number_format = top_left_cell.number_format
# 4. 文件保存逻辑
if output_path is None:
output_path = file_path
wb.save(output_path)
print(f"处理完成!共拆分 {len(merged_ranges)} 个合并单元格区域,文件保存路径:{output_path}")
return output_path
# ===================== 调用示例 =====================
if __name__ == "__main__":
# Windows本地文件路径,r字符串避免转义符报错
input_file = r"C:\Users\Administrator\Desktop\cs11.xlsx"
# 方式1:直接覆盖原文件
unmerge_merged_cells_fill_all(input_file)
# 方式2:生成新文件,不修改原文件(取消注释使用)
# new_file = r"C:\Users\Administrator\Desktop\cs11_处理后.xlsx"
# unmerge_merged_cells_fill_all(input_file, output_path=new_file)
四、核心逻辑分步讲解
1. 预读取全部合并区域(最关键一步)
openpyxl拆分单元格后,工作表会丢失合并区域记录,因此必须先循环读取所有合并范围存入列表,再进行拆分操作。
merged_ranges = list(ws.merged_cells.ranges)
2. 获取合并区域左上角数据
每个合并区域只有左上角单元格存储有效值,拆分后其余单元格会变成空白,所以先提前读取数值:
top_left_cell = ws.cell(row=min_row, column=min_col) top_left_value = top_left_cell.value
3. 拆分单元格+批量填充
调用unmerge_cells拆分,双层循环遍历原合并区域所有行列,统一赋值左上角数值。
4. 样式同步复制
使用copy()复制字体、背景填充、边框、对齐、数字格式,解决拆分后表格样式错乱问题:
current_cell.font = copy(top_left_cell.font) current_cell.fill = copy(top_left_cell.fill) current_cell.border = copy(top_left_cell.border) current_cell.alignment = copy(top_left_cell.alignment) current_cell.number_format = top_left_cell.number_format
五、两种使用方式说明
方式1:覆盖原Excel文件
直接传入文件路径,不指定output_path,处理完成后覆盖原文件:
input_file = r"C:\Users\Administrator\Desktop\cs11.xlsx" unmerge_merged_cells_fill_all(input_file)
方式2:输出新文件,保留原始数据
指定输出路径,生成全新文件,原文件不受修改,适合需要备份原始报表场景:
input_file = r"C:\Users\Administrator\Desktop\cs11.xlsx" output_file = r"C:\Users\Administrator\Desktop\cs11_拆分填充后.xlsx" unmerge_merged_cells_fill_all(input_file, output_path=output_file)
六、适用场景与扩展改造
适用场景
- 生产月度汇总表、年度统计报表(多行多列合并);
- 财务台账、项目台账导出后数据清洗;
- 数据导入数据库前预处理,消除空白单元格;
- pandas读取Excel前统一规整数据,避免空值干扰统计。
扩展改造思路
- 结合pandas向右填充空白:拆分合并单元格后,增加循环逻辑,按年月分区向右填充剩余空白单元格;
- 批量处理文件夹所有Excel:搭配
os遍历文件夹,批量拆分所有表格合并单元格; - 过滤指定工作表:增加判断,跳过不需要处理的Sheet;
- 导出日志记录:统计每个文件拆分的合并区域数量,生成处理日志txt。
七、常见问题解决
路径报错:Unicode转义 Windows路径前面加r原始字符串,避免\转义:
input_file = r"C:\Users\Administrator\Desktop\cs11.xlsx"
文件占用无法保存 关闭Excel软件后再运行代码,Excel打开时会锁定文件写入权限。
不支持.xls旧格式 openpyxl仅支持.xlsx,旧xls文件先用Excel另存为xlsx再处理。
无合并单元格无输出 代码内置判断,无合并区域会直接打印提示并退出,不会生成空白文件。
八、总结
这套工具函数解决了Excel合并单元格拆分后数据缺失的痛点,自动化填充数据+同步样式,几十行代码替代大量手动重复操作,适合数据分析、财务、运营人员日常报表清洗。代码封装完整、注释清晰,可直接复制使用,也能根据自身业务需求二次扩展。
以上就是Python实现拆分合并Excel单元格并自动填充原左上角数据的详细内容,更多关于Python处理Excel单元格的资料请关注脚本之家其它相关文章!
相关文章
python不使用for计算两组、多个矩形两两间的iou方式
今天小编就为大家分享一篇python不使用for计算两组、多个矩形两两间的iou方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-01-01


最新评论