Python pandas批量拆分Excel花名册:一人一表高效方案

宋时安
宋时安
发布时间:2026-11-08 | 4人浏览过
原创

针对上万条员工数据在Excel中处理卡顿的问题,本文提供基于Python pandas的自动化拆分方案。通过读取源文件、校验工号唯一性、按行导出为独立xlsx文件并生成核对清单,实现高效、准确的“一人一表”分发,避免手工操作误差及同名覆盖风险。

人事发来一张上万行的花名册,要求给每位员工单独留一份表。如果靠手工筛选、复制、另存为,不仅电脑容易卡死,还最怕忙活半天发现两个同名员工的数据被混在了一起,或者因为手抖覆盖了之前的文件。

这种重复性高、逻辑简单但数据量大的工作,正是编程工具擅长的领域。我们不需要复杂的数据库,只需利用 Python 的 pandas 库,就能在几分钟内完成从校验到导出的全过程,而且结果准确可追溯。

准备环境与整理源数据

在开始写代码之前,先确保你的 Windows 电脑上已经安装了 Python。将需要处理的花名册副本放入一个独立的文件夹,重命名为“花名册.xlsx”。为了程序能顺利读取,请确认工作表名称为“花名册”,且第一行是标准的列标题,其中必须包含“工号”和“姓名”两列。

特别注意,不要在表头上方夹杂单位名称,也不要在数据中间插入小计行或空行。对于工号、身份证号这类长数字,建议在 Excel 中将其格式设置为文本,以防前导零丢失。虽然 pandas 可以在读取时指定类型,但源数据的规范性直接决定了后续处理的省心程度。

在该文件夹空白处按住 Shift 键点击右键,选择“在此处打开 Powershell 窗口”或“在终端中打开”,输入以下命令安装必要的库:

py -m pip install pandas openpyxl

如果系统提示找不到 py 命令,请检查 Python 是否已正确安装并添加到环境变量,或者直接运行 python -m pip install pandas openpyxl。

Python pandas批量拆分Excel花名册:一人一表高效方案

准备环境与整理源数据

编写脚本:校验与拆分

新建一个文本文件,重命名为 split_roster.py,并将以下代码粘贴进去。这段逻辑的核心在于“先校验,后导出”,确保不会因为源数据中的脏数据导致程序崩溃或输出错误文件。

from pathlib import Path
import pandas as pd

# 设置路径
base = Path(__file__).resolve().parent
src = base / "花名册.xlsx"
out = base / "拆分结果"

# 读取数据,所有列强制转为字符串,避免数字精度丢失
df = pd.read_excel(
    src, sheet_name="花名册", engine="openpyxl",
    dtype=str, keep_default_na=False
)

# 去除完全为空的行
df = df.loc[~df.eq("").all(axis=1)].copy()

# 基础校验
required = {"工号", "姓名"}
if not required.issubset(df.columns):
    raise ValueError("缺少工号或姓名列,请核对表头")
if df.empty:
    raise ValueError("没有可导出的人员数据")

# 清理空格并检查空值
for col in ["工号", "姓名"]:
    df[col] = df[col].str.strip()
if df[["工号", "姓名"]].eq("").any().any():
    raise ValueError("工号或姓名存在空值,请补全后重试")

# 关键校验:工号必须唯一
if df["工号"].duplicated().any():
    raise ValueError("存在重复工号,请检查源数据是否一人多行")

# 创建输出目录,若已存在则报错防止覆盖旧数据
out.mkdir(exist_ok=False)

records = []
# 逐行导出
for i in range(len(df)):
    row = df.iloc[[i]]
    # 使用顺序编号命名,避免姓名特殊字符导致文件名错误
    filename = f"person_{i + 1:05d}.xlsx"
    row.to_excel(
        out / filename, sheet_name="人员信息",
        index=False, engine="openpyxl"
    )
    records.append({
        "文件名": filename,
        "工号": row.iloc[0]["工号"],
        "姓名": row.iloc[0]["姓名"]
    })

# 生成导出清单,方便后续核对
pd.DataFrame(records).to_excel(
    out / "导出清单.xlsx", index=False, engine="openpyxl"
)
print(f"导出结束,请核对清单,共 {len(records)} 人")

代码中特意使用了 person_00001.xlsx 这样的顺序编号作为文件名,而不是直接用姓名。这是因为 Windows 文件系统对文件名有特殊字符限制,且同名员工会导致文件覆盖。通过编号命名,再配合生成的“导出清单.xlsx”,既能保证文件安全,又能快速通过清单查找对应人员。

Python pandas批量拆分Excel花名册:一人一表高效方案

编写脚本:校验与拆分

运行脚本与结果核对

保存代码后,回到 PowerShell 窗口,运行以下命令:

py .\split_roster.py

程序运行结束后,文件夹中会出现一个名为“拆分结果”的新目录。里面包含了所有员工的独立表格以及一份汇总清单。此时不要急着分发,先做三步抽查:

  1. 打开“导出清单.xlsx”,核对总人数是否与源表有效行数一致。
  2. 随机打开第一个、最后一个以及中间某个编号的文件,确认表头完整,且数据确实属于该员工。
  3. 检查是否有工号为空或异常的行被错误导出。

需要注意的是,这种拆分方式生成的是纯净的数据表,源文件中的列宽、背景色、图片或复杂公式不会被保留。如果公司要求必须使用带照片和固定版式的登记表模板,则需要采用更复杂的模板填充方案,而非简单的数据拆分。

如果在运行过程中报错,例如提示“存在重复工号”,请务必回到源 Excel 中排查原因。可能是同一员工有多条培训记录或薪资明细,这种情况下需要先确定合并规则,再修改代码逻辑。确认无误后,即可将“拆分结果”文件夹分发给相关部门进行后续处理。

Python pandas批量拆分Excel花名册:一人一表高效方案

运行脚本与结果核对

相关标签:

本站声明

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

Python 相关产品和应用

全部下载

专题列表