Python办公之实现批量拆分Excel
作者:小庄-Python办公
在日常的办公和数据处理中,你是否经常遇到这样的场景:老板扔给你一个包含几万行数据的总表,让你按部门、按地区或者按月份拆分成几十个甚至上百个单独的 Excel 文件发给对应的负责人;又或者,由于系统导入限制,你需要把一个几十万行的大表每 1000 行拆分成一个小表。
如果是手动复制粘贴,不仅费时费力,还极容易出错。作为一名经常和数据打交道的“打工人”,怎么能被这种机械的体力活打败?今天,我就带大家用 Python 结合 PyQt5,从零打造一款带图形界面的“Excel 批量拆分神器”,只需点点鼠标,几秒钟就能搞定几小时的工作量!
工具核心功能展示
我们先来看看最终做出来的工具长什么样,以及它能干什么:
- 友好的可视化界面 (GUI):告别黑乎乎的命令行,支持直接拖拽文件或点击选择文件,操作直观。
- 两种核心拆分模式:
- 按列拆分:智能读取表头,提供下拉框供你选择需要拆分的列(例如选“部门”列,它就会自动按部门名称拆分出多个文件)。
- 按行数拆分:支持输入指定的行数(如每 500 行拆分一个文件)。
- 智能命名防冲突:拆分后的文件会自动带上“序号+分类名”,并且自动过滤了文件名中的非法字符,安全保存。
- 实时日志与弹窗提示:拆分进度一目了然,任务完成时会有贴心的弹窗提醒。
- 开箱即用的
.exe程序:利用 PyInstaller 打包,没有 Python 环境的同事也能双击直接使用。
技术栈揭秘
这套工具的底层逻辑其实非常清晰,主要依赖于以下几个 Python 明星库:
pandas:数据处理界的“扛把子”。用它的read_excel和to_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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
