python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python处理Excel单元格

Python实现拆分合并Excel单元格并自动填充原左上角数据

作者:幸福清风

还在手动拆分Excel合并单元格并逐个填充数据吗,本文教你用Python自动化处理:自动拆分所有合并区域,填充左上角原值,并完美复制字体、边框、对齐等样式,无视觉变化,告别重复劳动,大幅提升报表清洗效率,适合财务、生产、统计类报表

日常工作中处理Excel报表经常遇到合并单元格问题:

  1. 合并单元格导出数据后,只有左上角有数值,其余空白,做统计、匹配时会缺失数据;
  2. 手动拆分合并单元格后,需要复制左上角值填充整段区域,表格量大时重复操作效率极低;
  3. 拆分后单元格样式错乱,字体、对齐、边框需要手动重新调整。

本文基于openpyxl实现一套通用工具函数:自动读取Excel所有合并区域,拆分单元格后将原合并区域全部填充左上角原值,同时同步复制字体、边框、填充色、对齐等单元格样式,无需手动二次美化,完美适配财务、生产、统计类报表。

一、工具优势

  1. 提前缓存全部合并区域,避免拆分后丢失合并范围信息;
  2. 拆分后整块区域统一填充左上角原始数值;
  3. 完整复制原单元格样式,表格视觉无变化;
  4. 支持自定义工作表、自定义输出路径,可覆盖原文件或生成新文件;
  5. 纯本地处理,无需依赖在线表格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)

六、适用场景与扩展改造

适用场景

  1. 生产月度汇总表、年度统计报表(多行多列合并);
  2. 财务台账、项目台账导出后数据清洗;
  3. 数据导入数据库前预处理,消除空白单元格;
  4. pandas读取Excel前统一规整数据,避免空值干扰统计。

扩展改造思路

  1. 结合pandas向右填充空白:拆分合并单元格后,增加循环逻辑,按年月分区向右填充剩余空白单元格;
  2. 批量处理文件夹所有Excel:搭配os遍历文件夹,批量拆分所有表格合并单元格;
  3. 过滤指定工作表:增加判断,跳过不需要处理的Sheet;
  4. 导出日志记录:统计每个文件拆分的合并区域数量,生成处理日志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单元格的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文