Python实现精准拆分Excel文件大表数据功能
作者:小庄-Python办公
Python精准拆分——按城市/部门将总表数据秒拆成独立文件
场景引入
上一节我们学会了把上百份 Excel 合并成一张总表,但现实工作中,经常需要反其道而行之:
行政部收到了一份全公司 2000 名员工的年度花名册(一张大表),领导要求按部门拆分成独立文件,分别发给各部门负责人核对。手动筛选→复制→粘贴→保存,12 个部门做下来至少要半小时,还容易出错。
本节将教你如何用 Python 的 分组功能,10 行代码实现一键拆分,3 秒搞定。
技术原理
核心流程:
总表.xlsx(2000行数据)
↓
按"部门"列分组:groupby("部门")
↓
每个部门一个 DataFrame
↓
分别导出为独立 Excel 文件
↓
输出/
├── 人力资源部.xlsx
├── 财务部.xlsx
├── 技术部.xlsx
└── ...
关键技术点:
groupby():pandas 的分组函数,按指定列的值将数据分成若干组- 循环导出:遍历每个分组,调用
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')
每次循环:
group_name:分组值(如"技术部")group_df:该分组对应的 DataFrame(只包含该部门的数据)- 导出为独立 Excel 文件
5. 文件名安全处理
safe_name = str(group_name).replace('/', '_').replace('\\', '_')
Windows 文件名中不能包含以下字符:\ / : * ? " < > |,所以需要做替换处理。
进阶技巧
技巧 1:按多列组合拆分
比如按"部门"+"城市"两个维度同时拆分,文件名体现两个维度:
df['拆分键'] = df['部门'] + '_' + df['城市']
grouped = df.groupby('拆分键')
效果:
技术部_北京.xlsx技术部_上海.xlsx财务部_北京.xlsx
技巧 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() | 导出为 Excel | group_df.to_excel("技术部.xlsx") |
os.makedirs() | 创建输出目录 | os.makedirs("拆分结果") |
本节学会了 pandas 的 分组拆分 技能,与上一节的"合并"形成完整的数据整理闭环。实际工作中,合并→清洗→拆分,这三个操作覆盖了 80% 的 Excel 批量处理场景。
到此这篇关于Python实现精准拆分Excel文件大表数据功能的文章就介绍到这了,更多相关Python拆分Excel内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
