80行代码自己动手写一个表格拆分与合并小工具(文末附工具下载)
Posted 平静愉悦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了80行代码自己动手写一个表格拆分与合并小工具(文末附工具下载)相关的知识,希望对你有一定的参考价值。
公众号:可以叫我才哥
大家好,我是启航。
可能是最近加班熬夜太多,这个周末身体不舒服,头痛、冷汗什么的。终于在连着睡了接近2天后,现在慢慢恢复了。
最近有新朋友问有没有免费的小工具,可以进行表格的拆分与合并。其实wps
是有这两个功能的,而且效果还非常不错。不过,考虑到大家不一定都习惯wps
,这里我们简单写个小工具满足大家。
文末附工具及源码下载方式
合并与拆分效果如下:
合并——拆分
接下来,我们试试自己动手写这个工具吧!
1. 前期准备
由于我们采用的是python
进行工具编写,并最终需要打包成一个exe
文件供我们使用。为了降低包体大小,我们需要先创建一个虚拟环境
备用。
另外,在进行表格拆分与合并操作中采用的是第三方库pandas
,同时关于gui我们用的是pysimplegui
,打包成exe采用的是pyinstaller
。在创建虚拟环境后,我们将这些需要用到的第三方库也一一安装吧。
# 创建虚拟环境
conda create -n env_1 python=3.8.8
# 激活虚拟环境
conda activate env_1
# 安装三个库 (pandas一些操作需要依赖openpyxl和xlrd,建议加上)
pip install pandas
pip install openpyxl
pip install xlrd
pip install pysimplegui
pip install pyinstaller
关于这三个库,大家可以查阅官方文档了解更多:
pandas : https://pandas.pydata.org/
pysimplegui:https://pysimplegui.readthedocs.io/en/latest/
pyinstaller:http://www.pyinstaller.org/
前期准备工具就绪,我们开始进入工具编写阶段。
2. 表格拆分
Python实现表格拆分的逻辑比较简单,就是利用pandas
分组然后将每组的数据单独导出存表即可
原表数据长这样:
汇总表
# 拆分表格
def splitTable(df,_key):
print('----------正在进行表格拆分----------')
df = df.astype('str')
# 按照字段_key进行分组
grouped = df.groupby(by = _key)
# 输出分组数据导出成单表
for num , (i, data) in enumerate(grouped):
data.to_excel(f'.\\\\i.xlsx',index = False,sheet_name = i)
print(f'已经拆成num+1张表格...')
导出结果如下:
拆分
3. 表格合并
Python实现表格合并的本质是 遍历全部表格数据,然后采用concat
方法进行数据合并Pandas学习笔记02-数据合并。
因此,在这里我们主要用到两个库:os
和pandas
,其中os用于获取文件夹下全部满足要求的文件信息,pandas用于读取表格数据并进行concat
。
# 合并表格
def concatTable(folder):
print('----------正在进行表格合并----------')
# 新建一个空列表,用于存储表格数据
fileList = []
# 把文件夹下表格数据放在一个列表里
for fileName in os.walk(folder):
for table in fileName[2]:
path = fileName[0] + '\\\\' + table
if os.path.splitext(path)[1] in ('.xlsx','.xls'):
li = pd.read_excel(path)
fileList.append(li)
print(f'已读取len(fileList)个表格...')
else:
continue
# 用concat方法合并表单数据
result = pd.concat(fileList)
# 导出数据
result.to_excel(r'.\\合并后文件.xlsx',index=False,sheet_name='汇总')
4. GUI设计
因为要支持表格拆分和合并,我们已经在2和3部分将这两个功能封装为函数了。
关于GUI的功能部分,需要支持以下功能。
对于表格拆分部分,功能点:
-
选取文件:
Text
、InputText
、FileBrowse
-
读取文件后的拆分字段选取:
Text
、Combo
-
拆分:
Button
对于表格合并部分,功能点:
-
选取文件夹:
Text
、InputText
、FolderBrowse
-
合并:
Button
此外,我们还需要有用于展示 程序操作记录的输出框、工具操作说明文本以及关闭程序按钮。
基于以上需求,我们可以构建GUI布局如下:
# 布局设置
layout = [[sg.Text('选择待拆分的文件:',font=("微软雅黑", 12)),sg.InputText(key='file',size=(60,1),font=("微软雅黑", 10),enable_events=True) ,sg.FileBrowse('打开',file_types=(("Text Files", "*.xls*"),),font=("微软雅黑", 12))],
[sg.Text('选择待拆分的字段:',font=("微软雅黑", 12)),sg.Combo('',tooltip='选择用于拆分的字段',font=("微软雅黑", 10), default_value='',auto_size_text=True,size=(15, 5),key='-keys-'),sg.Button('开始拆分',font=("微软雅黑", 12))],
[sg.Text('选择待合并文件夹:',font=("微软雅黑", 12)),sg.InputText(key='Folder',size=(60,1),font=("微软雅黑", 10),enable_events=True) ,sg.FolderBrowse('打开文件夹',font=("微软雅黑", 12)),sg.Button('开始合并',font=("微软雅黑", 12))],
[sg.Text('程序操作记录:',justification='center')],
[sg.Output(size=(100, 10),font=("微软雅黑", 10))],
[sg.Text('操作说明:',font=("微软雅黑", 12))],
[sg.Text('表格拆分指引:选择文件—>选择用于拆分的字段—>开始拆分\\n表格合并指引:选择需要合并的表格所在文件夹—>开始合并',font=("微软雅黑", 10)),sg.Text('',font=("微软雅黑", 12),size=(35, 1)),sg.Button('关闭程序',font=("微软雅黑", 12),button_color ='red')]
]
由于我们在进行表格拆分时需要先选定文件及拆分字段,而拆分字段是在选定文件后读取到的文件数据的表头,所以需要在sg.InputText()
中将参数enable_events
设置为True
,这样选定文件操作就是一个事件,可以触发某些操作。
接下来,我们编写循环事件功能如下:
# 事件循环
while True:
event, values = window.read()
if event in (None, '关闭程序'):
break
if event == 'file':
fileName = values['file']
if os.path.exists(fileName):
df = pd.read_excel(fileName)
keys = df.columns.to_list()
window["-keys-"].Update(values = keys,font=("微软雅黑", 10),size=(15, 8))
else:
print('文件不存在\\n请先选择正确文件')
if event == '开始拆分':
if values['-keys-']:
_key = values['-keys-']
splitTable(df,_key)
print('----------拆分工作已经完成----------\\n')
else:
print('字段未选择-请先选择字段\\n或文件未选取-请先选择文件')
if event == '开始合并':
if values['Folder']:
folder = values['Folder']
concatTable(folder)
print('----------合并工作已经完成----------\\n')
else:
print('待合并文件所在文件夹未选择')
window.close()
根据需求,我们将事件类型分为三种:
-
当我们选定待拆分文件后,先读取文件内容,然后获取文件数据的表头,从而刷新(
window["-keys-"].Update
)拆分字段的下拉框为表头内容; -
当我们点击开始拆分按钮时,需要判断拆分字段是否选取(默认为空),若有选定字段则进行拆分操作,否则会进行错误操作提示;
-
当我们点击开始合并按钮时,需要判断是否选定了文件夹,若是则调用合并数据函数进行合并操作,否则会进行错误操作提示。
5. 打包代码
这里采用的是pyinstaller
进行程序代码打包,操作指令如下:
pyinstaller -F -w 表格拆分合并工具.py
部分参数含义:
-F 表示生成单个可执行文件
-w 表示去掉控制台窗口,这在GUI界面时非常有用
-p 表示你自己自定义需要加载的类路径,一般情况下用不到
-i 表示可执行文件的图标
文章到这里就结束了,感谢你的观看
说实在的,每次在后台看到一些读者的回应都觉得很欣慰,我想把我收藏的一些编程干货贡献给大家,回馈每一个读者,希望能帮到你们。
干货主要有:
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python所有知识点汇总(可以弄清楚Python的所有方向和技术)
*如果你用得到的话可以直接拿走,在我的QQ技术交流群里,可以自助拿走,群号是854406358。*
以上是关于80行代码自己动手写一个表格拆分与合并小工具(文末附工具下载)的主要内容,如果未能解决你的问题,请参考以下文章
80行代码自己动手写一个表格拆分与合并小工具(文末附工具下载)
80行代码自己动手写一个表格拆分与合并小工具(文末附工具下载)
40行代码自己动手写pdf转word小工具(文末附工具下载)