Python合并拆分Excel的实操方法

Chloe
Chloe
发布时间:2026-10-11 | 2人浏览过
原创

在日常数据处理中,将零散的工作簿汇总为一个文件或把超大的报表按规格切块是高频场景。本文基于 Python 生态提供两套轻量脚本,分别解决多文件按行合并与按行数分割带表头的难题,附带关键参数说明与运行排错指南。

合并多个 Excel 文件的实现步骤

当需要将多个结构一致的 Excel 表格汇总为单一文件时,可通过遍历读取生成 DataFrame 列表,再利用 pandas 按行轴方向进行拼接。此方案要求参与合并的文件拥有完全一致的列名与数据类型,否则会导致字段错位或覆盖冲突。

第1步:配置运行环境与依赖库

合并 .xlsx 格式文件需要安装 pandas 及其底层引擎 openpyxl。在终端执行 pip install pandas openpyxl 即可完成环境准备。若涉及 .xls 旧版格式,需额外安装 xlrd==2.0.1 以避免兼容警告。

第2步:编写读取与数据拼接代码

建立统一的读取接口,接收文件路径列表后依次加载为 DataFrame。随后使用 pd.concat() 执行纵向合并,并关闭行索引以保持输出表格整洁。

import pandas as pd

def read_xlsx(xlsx_list):
    """读取指定的 xlsx 文件列表"""
    if not xlsx_list:
        print("没有任何 xlsx 文件,无法读取数据")
        return []
    df_list = [pd.read_excel(file) for file in xlsx_list]
    return df_list

def merge_xlsx(df_list, save_path):
    """按行合并 DataFrame 并保存为新文件"""
    if not df_list:
        print("没有可合并的数据")
        return ""
    merged_df = pd.concat(df_list, axis=0)
    merged_df.to_excel(save_path, index=False)
    return save_path

# 示例调用
file_list = ["data_part1.xlsx", "data_part2.xlsx", "data_part3.xlsx"]
df_list = read_xlsx(file_list)
output_file = merge_xlsx(df_list, "merged_output.xlsx")
print(f"合并后的文件路径:{output_file}")

代码执行完毕后,会在运行目录生成合并后的目标文件。若部分源文件缺失某些列,建议在生产环境中增加 align=True 参数或预处理对齐逻辑。

按行数拆分大型 Excel 表格

当原始表格超过软件打开性能阈值时,按固定行数进行切分能显著提升读取速度。拆分过程需特别注意:除首个数据块外,后续每个子表都应独立包含原表头,以便后续单独查看或入库。

第1步:解析原表结构与表头数据

使用 xlrd 打开目标 .xls 文件,锁定第一个工作表。获取总行数(nrows)用于计算切片区间,同时提取首行作为标准表头供后续复用。

第2步:划分数据块并独立导出

根据预设的单表最大行数(如 500 行)计算循环次数。每次迭代创建新的 xlwt 工作簿,强制写入表头占位,再将对应区间的数值逐格填入下方单元格,最后调用 .save() 落盘。

import xlrd
import xlwt

def split_excel_by_row(file_path, split_rows=500):
    """将 xls 文件按指定行数拆分为多个子表,每个子表保留表头"""
    if not file_path:
        print("未提供需要拆分的表格路径")
        return []

    wb = xlrd.open_workbook(file_path)
    sheet = wb.sheet_by_index(0)
    total_rows = sheet.nrows
    if total_rows <= split_rows + 1:
        print("原始表格行数不足,无需拆分")
        return []

    header = sheet.row_values(0)
    split_size = split_rows + 1
    saved_files = []

    for i in range(total_rows // split_size):
        workbook = xlwt.Workbook()
        ws = workbook.add_sheet(f"Sheet{i+1}")

        # 每个拆分文件均写入完整表头,保证独立性
        for col_idx, val in enumerate(header):
            ws.write(0, col_idx, val)

        start_row = i * split_size
        end_row = min(start_row + split_size, total_rows)

        # 写入数据区域(从第1行开始,避开表头)
        for row_offset in range(split_rows):
            if start_row + 1 + row_offset >= total_rows:
                break
            row_data = sheet.row_values(start_row + 1 + row_offset)
            for col_idx, val in enumerate(row_data):
                ws.write(row_offset + 1, col_idx, val)

        out_name = f"split_data_part_{i+1}.xls"
        workbook.save(out_name)
        saved_files.append(out_name)
        print(f"成功生成拆分文件:{out_name}")

    return saved_files

# 示例调用
# split_excel_by_row("large_dataset.xls", split_rows=500)

脚本完成后,所有子文件会按顺序保存至同级目录。若需处理含合并单元格的源文件,建议先用 Excel 自带工具取消合并并填充值后再运行脚本。

运行排错与注意事项

  • 文件占用报错:合并或拆分时若触发 [Errno 13] Permission denied,请检查目标 Excel 是否正被 WPS 或 Office 打开,关闭后再重试。
  • 新旧格式兼容:xlwt 仅支持输出 .xls 格式。若业务强制要求 .xlsx 拆分产物,需将写入逻辑替换为 pandas.ExcelWriter(engine='openpyxl')。
  • 路径与编码:Windows 用户遇到中文路径空格截断问题,建议使用绝对路径或 Path.resolve() 规范化路径字符串。

以上就是使用 Python 自动化处理 Excel 合并与拆分任务的详细内容,更多关于 Python 办公自动化与数据处理技巧的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表