学习、生活、工作中,你一定遇到过,在一个 Excel 表格中,你需要将多个子表格的数据汇总到一个子表格中,看图:
实现这一功能,可以直接用 Excel
自带的语法,但操作上还是比较复杂的,今天我给大家科普一下用 Python
也能完成以上操作,先把基本思路告诉大家:
直接上实操,这里我们以之前给大家看过的工资表为例,如果大家没有数据的话,可以自己先造点数据。
其实,如果你的源文件是 csv
格式导入进来的话,可以直接用openpyxl
来处理,但是很多时候我们拿到手上的表格中带了各种各样的格式,那么我们使用 openpyxl
处理数据就会有麻烦。因为openpyxl
在处理数据的时候,会识别样式,认为这些有样式的行是有数据的,所以纯粹的sheet.append()
方法是无法将数据写入这些所谓的空行。
所以我们这里为了普适性,利用 pandas。pandas还是非常方便的,因为他可以无视表格的样式。
path = glob.glob(/demo3.xls)[0]
workbook_1 = load_workbook(filename=path)
# 获取总表数
sheet_names = workbook.sheet_names
df_lst = []
for i in range(1, len(sheet_names )):
df = pd.read_excel(path_new , encoding='utf-8', sheet_name=i, skiprows=1)
df_lst.append(df)
# 把获取的各表纵向合并,
df_total = pd.concat(df_lst,axis=0,ignore_index=True)
# 注意纵向合并常常需要重置索引,索引是从0开始,利用索引+1重置各记录的编号
df_total['编号'] = df_total.index + 1
完成 Excel 中 Sheet 的读取并合并汇总到汇总表之后,所有的数据就可以在“汇总”这个表中看到了。
但是,这里我们要注意,由于直接使用 dataframe.to_excel
会把原来的 Excel 全都覆盖掉了。
什么意思?
也就是说你执行完程序之后,只剩下一个有且仅有汇总表数据的 Excel了,其他 sheet 会全部丢失。
所以,为了保险起见,我建议另存为一个新的 Excel。我们可以利用 pd.ExcelWriter
将汇总数据另存为一个新 Excel。
writer = pd.ExcelWriter(path, engine='openpyxl')
writer.book = workbook
workbook.remove(workbook['汇总'])
df_total.to_excel(excel_writer=writer, sheet_name=u'汇总', index=None)
writer.close()
workbook._sheets.insert(0, workbook._sheets.pop())
workbook.save(filename= '/demo3-1.xls')
大功告成,唯一的缺点就是没有格式了,不过一般这样汇总之后肯定要重新整理格式的。