Python办公之实现批量拆分Excel

 更新时间:2026年04月12日 08:06:07   作者:小庄-Python办公  
这篇文章主要为大家详细介绍了如何使用Python结合 PyQt5,从零打造一款带图形界面的Excel 批量拆分神器,只需点点鼠标,几秒钟就能搞定几小时的工作量

在日常的办公和数据处理中,你是否经常遇到这样的场景:老板扔给你一个包含几万行数据的总表,让你按部门、按地区或者按月份拆分成几十个甚至上百个单独的 Excel 文件发给对应的负责人;又或者,由于系统导入限制,你需要把一个几十万行的大表每 1000 行拆分成一个小表

如果是手动复制粘贴,不仅费时费力,还极容易出错。作为一名经常和数据打交道的“打工人”,怎么能被这种机械的体力活打败?今天,我就带大家用 Python 结合 PyQt5,从零打造一款带图形界面的“Excel 批量拆分神器”,只需点点鼠标,几秒钟就能搞定几小时的工作量!

工具核心功能展示

我们先来看看最终做出来的工具长什么样,以及它能干什么:

  1. 友好的可视化界面 (GUI):告别黑乎乎的命令行,支持直接拖拽文件或点击选择文件,操作直观。
  2. 两种核心拆分模式
    • 按列拆分:智能读取表头,提供下拉框供你选择需要拆分的列(例如选“部门”列,它就会自动按部门名称拆分出多个文件)。
    • 按行数拆分:支持输入指定的行数(如每 500 行拆分一个文件)。
  3. 智能命名防冲突:拆分后的文件会自动带上“序号+分类名”,并且自动过滤了文件名中的非法字符,安全保存。
  4. 实时日志与弹窗提示:拆分进度一目了然,任务完成时会有贴心的弹窗提醒。
  5. 开箱即用的 .exe 程序:利用 PyInstaller 打包,没有 Python 环境的同事也能双击直接使用。

技术栈揭秘

这套工具的底层逻辑其实非常清晰,主要依赖于以下几个 Python 明星库:

  • pandas:数据处理界的“扛把子”。用它的 read_excelto_excel 方法,加上简单的切片和过滤逻辑,轻松完成数据的拆分。
  • PyQt5:负责门面担当。构建出现代化、响应式的桌面应用程序界面。
  • calamine:为了解决传统 openpyxl 读取大文件较慢的问题,我们在 pandas 中指定了 engine='calamine',读取速度直接起飞。

核心代码解析

虽然有几百行代码,但最核心的“灵魂”其实都在后台拆分线程 (SplitWorker) 中。为了不让界面在处理大文件时卡死,我们必须使用多线程(QThread)。

1. 按列拆分逻辑

如果用户选择“按列拆分”,程序首先需要获取该列的所有唯一值,然后循环过滤并保存:

# df 是读取进来的 pandas DataFrame
column_name = self.split_value # 用户在下拉框选择的列名

# 获取该列所有的唯一值(去重)
unique_values = df[column_name].unique()

for i, value in enumerate(unique_values, 1):
    # 过滤出当前分类的数据
    subset = df[df[column_name] == value]
    
    # 清理文件名中的非法字符(非常重要的一步,防止保存报错)
    safe_value = str(value)
    for char in r'\/:*?"<>|':
        safe_value = safe_value.replace(char, '_')
        
    # 组合新文件名并导出
    output_file = os.path.join(self.output_dir, f"{base_name}_{i:03d}_{safe_value}.xlsx")
    subset.to_excel(output_file, index=False)

2. 按行拆分逻辑

如果用户选择“按行数拆分”,则主要利用 pandas 的 iloc 按行索引进行切片:

rows_per_file = int(self.split_value) # 用户输入的行数
total_rows = len(df)
# 计算总共需要拆分出几个文件
num_files = (total_rows + rows_per_file - 1) // rows_per_file

for i in range(num_files):
    # 计算当前文件的起始和结束索引
    start_idx = i * rows_per_file
    end_idx = min((i + 1) * rows_per_file, total_rows)
    
    # 切片截取数据
    subset = df.iloc[start_idx:end_idx]
    
    # 生成序号文件名并导出
    output_file = os.path.join(self.output_dir, f"{base_name}_{i+1:03d}.xlsx")
    subset.to_excel(output_file, index=False)

3. 提升用户体验的小细节

为了让工具看起来更专业,我们在代码中加入了很多细节处理:

智能表头读取:每次拖入新文件或修改“表头行数”时,程序会只读取 0 行数据nrows=0)来快速获取列名,并自动更新到下拉框中。

PyInstaller 图标兼容:使用 sys._MEIPASS 获取临时解压目录,确保打包成 .exe 后图标依然能够正常显示:

def resource_path(self, relative_path):
    """获取资源的绝对路径,兼容PyInstaller打包后的临时目录"""
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative_path)
    return os.path.join(os.path.abspath("."), relative_path)

如何打包分享给同事?

写好代码只是第一步,能让不懂编程的同事用起来才是真正的“造福人类”。

首先准备一张好看的 .png 图标,用 Python 转成 .ico 格式:

from PIL import Image
Image.open('拆分行.png').save('icon.ico', format='ICO', sizes=[(256, 256)])

使用 PyInstaller 执行一键打包:

pyinstaller --noconfirm --onefile --windowed --icon="icon.ico" --add-data="拆分行.png;." --name="Excel批量拆分神器" excel_splitter.py

参数解释:--onefile 生成单文件,--windowed 隐藏黑框,--add-data 将图标资源内嵌到程序中。

打包完成后,你会在 dist 文件夹下得到一个名为 Excel批量拆分神器.exe 的文件。直接把它发给同事,收获他们崇拜的目光吧!

结语

从一行行重复的复制粘贴,到几秒钟批量搞定,Python 在办公自动化领域的威力不容小觑。通过这个项目,我们不仅复习了 Pandas 的数据处理技巧,还实战演练了 PyQt5 界面开发和多线程操作。

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

相关文章

  • python将三维数组展开成二维数组的实现

    python将三维数组展开成二维数组的实现

    今天小编就为大家分享一篇python将三维数组展开成二维数组的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • python和opencv构建运动检测器的实现

    python和opencv构建运动检测器的实现

    这篇文章主要介绍了python和opencv构建运动检测器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 利用Pycharm将python文件打包为exe文件的超详细教程(附带设置文件图标)

    利用Pycharm将python文件打包为exe文件的超详细教程(附带设置文件图标)

    在日常使用pycharm写好程序后,如何将程序打包为exe文件呢,下面这篇文章主要给大家介绍了关于利用Pycharm将python文件打包为exe文件的超详细教程,附带设置文件图标,需要的朋友可以参考下
    2022-08-08
  • python3.6.3+opencv3.3.0实现动态人脸捕获

    python3.6.3+opencv3.3.0实现动态人脸捕获

    这篇文章主要为大家详细介绍了python3.6.3+opencv3.3.0实现动态人脸捕获,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • Python import与from import使用和区别解读

    Python import与from import使用和区别解读

    Python程序可以调用一组基本的函数(即内建函数),比如print()、input()和len()等函数。接下来通过本文给大家介绍Python import与from import使用及区别介绍,感兴趣的朋友一起看看吧
    2021-09-09
  • Python如何绘制概率分布直方图浅析

    Python如何绘制概率分布直方图浅析

    项目中在前期经常要看下数据的分布情况,这对于探究数据规律非常有用,概率分布表示样本数据的模样,使用Python绘制频率分布直方图非常简洁,因为用的频次非常高,这篇文章主要给大家介绍了关于Python如何绘制概率分布直方图的相关资料,需要的朋友可以参考下
    2021-12-12
  • Python判断回文链表的方法

    Python判断回文链表的方法

    这篇文章主要介绍了Python判断回文链表,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • 详解如何在PyQt5中实现平滑滚动的QScrollArea

    详解如何在PyQt5中实现平滑滚动的QScrollArea

    Qt 自带的 QScrollArea 滚动时只能在两个像素节点之间跳变,看起来很突兀。所以本文将通过定时器,重写 wheelEvent() 来实现平滑滚动,需要的可以参考一下
    2023-01-01
  • 对python 自定义协议的方法详解

    对python 自定义协议的方法详解

    今天小编就为大家分享一篇对python 自定义协议的方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • python 爬取国内小说网站

    python 爬取国内小说网站

    国内小说网站的结构,大概都如出一辙,改改地址,就差不多了,有此需求的朋友可以参考下本文的爬虫写法
    2021-06-06

最新评论