想获得老板的赏识?把重复的Excel表格整理工作交给Python
Brief
通过Excel文件读取,DataFrame数据处理,自动完成繁琐无趣的表格整理工作,最后借助Pyinstaller生成可执行文件,以便在没有Python环境的Windows电脑运行。
1
我工作所在的团队,小朋友D的每一天都以一件繁琐枯燥的工作开始:日报汇总。他需要汇总同事们昨天的工作内容,然后发给老板。
小朋友D要打开关闭20多个Excel文件,复制粘贴到一起,根据工作重要程度排序,统计工作地点等,进行一系列重复性操作,而且随着团队逐渐壮大,这项工作也变得越来越让人烦躁。
自己正好最近开始从零学Python,正好啃到数据存取与清洗,一激动就产生了帮别人偷懒的念头。能不能用Python写个小程序,把这种重复性的工作交给机器呢?
2
首先,我们来看一下输入和输出分别是什么。我拿到的是每位同事的工作日报Excel表,里面包含按照不同类别分类的工作内容和今、明两日工作地点记录,其中“类别”和“工作地点”都是有选项列表的,而最终老板要的是个汇总文档,而且要求重要的内容放前面,相同的内容要合并。
大体思路是,首先把各个表格的数据拿出来汇总成一份数据,然后根据工作重要程度先后筛选出不同类别的工作,再按照今日、明日分别筛选出相同工作地点的员工进行汇总,最后输出日报文档。
3
假设我现在有'小丸子.xlsx', '维尼.xlsx', '小猪.xlsx'3个同事的表格要汇总。先建立一个空的DataFrame变量RawData,逐一读取Excel文件添加到RawData里面,获取原始汇总数据就这么简单,只需要提供Excel的名称就好了,默认读取的是第一张Sheet,也可以指定读取任意的Sheet。
RawData = pd.DataFrame()
# 文件列表
filename = ['小丸子.xlsx', '维尼.xlsx', '小猪.xlsx']
# 从excel文件获取数据,并拼接
for i in range(len(filename)):
df = pd.read_excel(filename[i])
RawData = RawData.append(df)
4
然后我们打开一个叫”daily_report”的txt文件,准备编写汇总文档。假设工作内容的类别包括'需求设计', '需求提交后业务支持', '测试', '其他',注意这个列表数据一定要按照工作类别的重要性排序,这样才能保证数据写进汇总文档时也是按照工作重要性来编排的。
通过for循环从RawData里面筛选出只包含特定类别的表,并取‘工作内容’列的DataFram型数据转化成列表数据,写进汇总文档中。注意这里的write操作如果改用writelines的话,写入的数据之间是不会自动换行的,需要对列表进行处理,数据之间插入换行符。
with open('daily_report.txt', 'w') as f:
# 写入日期
f.write(str_yesterday+'')
f.write('工作内容')
#工作分类
job_list = [ '需求设计', '需求提交与提交后的业务支持', '测试', '其它']
# 读取每个工作分类的内容并按分类写进txt文档
for n in range(len(job_list)):
df_work = RawData.loc[RawData['类别'] == job_list[n]]
# 获取该分类下工作内容列表,把df数据转化成list数据
work_list = df_work['工作内容'].values.tolist()
# 当数组不为空时,进行写入操作
if work_list:
for m in range(len(work_list)):
f.write(work_list[m])
f.write('')
5
最后是统计工作地点,方法与工作内容汇总类似,以“今日工作地点”为例。假设工作地点选项包括'学校', '家', '出差', 通过for循环拿到每个工作地点的工作人员列表,写进汇总文档中。
# 写入工作地点
f.write('工作地点:')
# 工作地点分类
location = ['学校', '家', '出差']
# 截取表格中关于工作地点的内容
data = RawData.loc[RawData['类别'] == '今日工作地点']
for n in range(len(location)):
# 读取每个工作地点分类的内容
df_location = data.loc[data['工作内容'] == location[n]]
# 获取该分类下工作人员列表
worker_list = df_location['备注'].values.tolist()
# 当列表非空时操作
if worker_list:
f.write(location[n]+":")
for m in range(len(worker_list)):
f.write(worker_list[m]+" ")
f.write('。')
6
最后,因为同事的电脑并没有Python环境,为了方便他使用,我生成了exe文件。
PyInstaller是一个压缩python文件成为可执行程序的软件,它会扫描你所有的Python文档,并分析你代码运行所需的模块,最后把这些模块和你的代码打包一起,这样其它用户不用安装Python运行环境,直接运行exe文件就可以了。
针对Pycharm的操作步骤如下:
安装Pyinstaller库
通过File-Settings-Tools-Exteral Tools新增工具并配置参数,program栏位是填写Pyinstaller.exe文件的路径,Parameters栏位是写打包命令,我填写的是” -F dailyreport.py”,dailyreport是我要打包的py文件,F代表直接生成单独的exe文件。Working directory是要打包的py文件路径。
配置完后,点击tools-exteral tools,选择刚刚新增的pyinstaller工具即可。最后在当前的文件目录里会生成两个文件夹:build和dist。dist里面就是可执行文件。
7
细心的读者会发现,我并没有对工作内容进行合并同类项,这是因为每位同事对同个工作的表述是不一样的,通过机器很难判断,只能让汇总同事最后把把关了。总结一下这个项目用到的知识点: