python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python拆分Excel

Python实现精准拆分Excel文件大表数据功能

作者:小庄-Python办公

这篇文章主要为大家详细介绍了如何使用Python实现精准拆分Excel文件大表数据功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

Python精准拆分——按城市/部门将总表数据秒拆成独立文件

场景引入

上一节我们学会了把上百份 Excel 合并成一张总表,但现实工作中,经常需要反其道而行之:

行政部收到了一份全公司 2000 名员工的年度花名册(一张大表),领导要求按部门拆分成独立文件,分别发给各部门负责人核对。手动筛选→复制→粘贴→保存,12 个部门做下来至少要半小时,还容易出错。

本节将教你如何用 Python 的 分组功能,10 行代码实现一键拆分,3 秒搞定。

技术原理

核心流程:

总表.xlsx(2000行数据)
    ↓
按"部门"列分组:groupby("部门")
    ↓
每个部门一个 DataFrame
    ↓
分别导出为独立 Excel 文件
    ↓
输出/
├── 人力资源部.xlsx
├── 财务部.xlsx
├── 技术部.xlsx
└── ...

关键技术点:

  1. groupby():pandas 的分组函数,按指定列的值将数据分成若干组
  2. 循环导出:遍历每个分组,调用 to_excel() 分别保存

环境准备

pip install pandas openpyxl

完整代码

import os
import pandas as pd

def split_excel_by_column(input_file, split_column, output_dir="拆分结果"):
    """
    按指定列的值将 Excel 总表拆分为多个独立文件

    参数:
        input_file: 输入的总表 Excel 文件路径
        split_column: 用于拆分的列名(如"部门"、"城市")
        output_dir: 输出文件夹路径
    """
    # 1. 读取总表
    if not os.path.exists(input_file):
        print(f"错误:文件 {input_file} 不存在!")
        return

    df = pd.read_excel(input_file, engine='openpyxl')
    print(f"总表数据:{len(df)} 行,{len(df.columns)} 列")

    # 2. 检查拆分列是否存在
    if split_column not in df.columns:
        print(f"错误:列名 '{split_column}' 不存在!可用列:{list(df.columns)}")
        return

    # 3. 创建输出目录
    os.makedirs(output_dir, exist_ok=True)

    # 4. 按指定列分组并导出
    grouped = df.groupby(split_column)
    group_count = 0

    for group_name, group_df in grouped:
        # 清理文件名中的非法字符(Windows 文件名不允许的字符)
        safe_name = str(group_name).replace('/', '_').replace('\\', '_')
        safe_name = safe_name.replace('*', '').replace('?', '').replace(':', '')

        output_file = os.path.join(output_dir, f"{safe_name}.xlsx")
        group_df.to_excel(output_file, index=False, engine='openpyxl')
        group_count += 1
        print(f"[{group_count}] 已拆分: {safe_name} ({len(group_df)} 行)")

    print(f"\n拆分完成!共生成 {group_count} 个文件,保存在: {output_dir}/")


# ==================== 使用示例 ====================
if __name__ == "__main__":
    # ========== 示例 1:按部门拆分 ==========
    split_excel_by_column(
        input_file="员工花名册总表.xlsx",
        split_column="部门",
        output_dir="按部门拆分"
    )

    # ========== 示例 2:按城市拆分 ==========
    # split_excel_by_column(
    #     input_file="销售数据总表.xlsx",
    #     split_column="城市",
    #     output_dir="按城市拆分"
    # )

代码逐行解析

1. 读取总表

df = pd.read_excel(input_file, engine='openpyxl')

将 Excel 文件加载为 DataFrame,后续所有操作都基于这个数据结构。

2. 验证列名

if split_column not in df.columns:
    print(f"错误:列名 '{split_column}' 不存在!可用列:{list(df.columns)}")
    return

防止用户输入了错误的列名。df.columns 返回所有列名的列表。

3. 核心:groupby 分组

grouped = df.groupby(split_column)

groupby() 是 pandas 最强大的函数之一。它按照指定列的值将数据分成若干组:

部门姓名工资
技术部张三15000
财务部李四12000
技术部王五16000
人事部赵六11000

按"部门"分组后得到 3 组:

4. 遍历分组并导出

for group_name, group_df in grouped:
    output_file = os.path.join(output_dir, f"{group_name}.xlsx")
    group_df.to_excel(output_file, index=False, engine='openpyxl')

每次循环:

5. 文件名安全处理

safe_name = str(group_name).replace('/', '_').replace('\\', '_')

Windows 文件名中不能包含以下字符:\ / : * ? " < > |,所以需要做替换处理。

进阶技巧

技巧 1:按多列组合拆分

比如按"部门"+"城市"两个维度同时拆分,文件名体现两个维度:

df['拆分键'] = df['部门'] + '_' + df['城市']
grouped = df.groupby('拆分键')

效果:

技巧 2:拆分时只保留特定列

for group_name, group_df in grouped:
    # 只保留需要的列
    keep_columns = ['姓名', '工号', '邮箱', '电话']
    existing_columns = [col for col in keep_columns if col in group_df.columns]
    group_df[existing_columns].to_excel(output_file, index=False, engine='openpyxl')

技巧 3:拆分后自动压缩打包

import shutil

# 拆分完成后打包为 ZIP
shutil.make_archive("拆分结果", 'zip', output_dir)
print("已打包为 拆分结果.zip")

技巧 4:按数值区间拆分

不是按列的值拆分,而是按数值范围(如按工资区间拆分):

# 定义工资区间
conditions = [
    (df['工资'] < 8000),
    (df['工资'] >= 8000) & (df['工资'] < 15000),
    (df['工资'] >= 15000)
]
choices = ['初级', '中级', '高级']
df['工资等级'] = pd.cut(df['工资'], bins=[0, 8000, 15000, float('inf')], labels=['初级', '中级', '高级'])
grouped = df.groupby('工资等级')

常见问题

Q1:拆分后文件数量不对,比预期的少?

原因:某些分类值完全相同(比如有全角/半角空格差异),被合并为一组。

排查

print(df['部门'].unique())  # 查看唯一的部门值
print(df['部门'].value_counts())  # 查看每个部门的行数

Q2:拆分出来的文件打不开?

检查文件名中是否含有 Windows 不允许的字符(/ \ : * ? " < > |)。代码中已做基本处理,但如果分类值含有其他特殊字符,可能需要额外处理。

Q3:想保留原始表格的格式(列宽、字体等)怎么办?

pandas 导出时不保留格式。如需保留格式,可以使用 openpyxl 库手动设置:

from openpyxl import load_workbook

# 先复制模板
import shutil
shutil.copy("模板.xlsx", output_file)

# 再写入数据
wb = load_workbook(output_file)
ws = wb.active
for row_idx, row in enumerate(group_df.values, start=2):
    for col_idx, value in enumerate(row, start=1):
        ws.cell(row=row_idx, column=col_idx, value=value)
wb.save(output_file)

总结

核心函数作用示例
groupby(列名)按列值分组df.groupby("部门")
to_excel()导出为 Excelgroup_df.to_excel("技术部.xlsx")
os.makedirs()创建输出目录os.makedirs("拆分结果")

本节学会了 pandas 的 分组拆分 技能,与上一节的"合并"形成完整的数据整理闭环。实际工作中,合并→清洗→拆分,这三个操作覆盖了 80% 的 Excel 批量处理场景。

到此这篇关于Python实现精准拆分Excel文件大表数据功能的文章就介绍到这了,更多相关Python拆分Excel内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

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