我们工作中经常要遇到这种情况:需要把一个总的excel工作薄,按‘部门’字段分成N个工作薄,单独发给不同的部门。
通过网上搜索,有方方格子等插件能实现部分功能。但遇到工作薄下有多个工作表时仍然不好操作。比如我现在遇到的问题:
1、要按渠道名称分成不同的工作薄
2、每个工作薄下又有很多工作表,每个表都要按部门分开
这种情况,插件也不好使,想了想便考虑用python来解决。下面来说解决思路和代码。
1、首先导包,设置目标工作表的路径。
import numpy as np
import pandas as pd
#输入的excel文档名
a=input('目标工作表:') #手动输入表名
out='C:UsershubiaoDesktop'+a+'.xlsx' #目标表的路径,我这里是放在桌面了
2、并获取工作薄下的所有表名,并设置按哪个字段分表(我这里是按'渠道名称')。
#获取工作薄所有表名
datashname=pd.read_excel(out,None) #第二个参数为None,获取一个已表名为键的字典
sname=datashname.keys() #获取字典的键
#通过工作薄的第一张表获取所有的渠道名称
qudao=pd.read_excel(out,sheet_name=0)['渠道名称'].value_counts().index
3、接下来就是分表了,我这里的思路是:建立一个某个渠道的工作薄,然后再把这个渠道相关的表分别写入不同的sheet。用两个for循环实现,代码不复杂,关键是理清思路。
#分表
for y in qudao: #循环部门,并设置保存的路径
writer=pd.ExcelWriter('C:UsershubiaoDesktoppyexport'+y+'.xlsx')
for x in sname:
dataall=pd.read_excel(out,sheet_name=x) #遍历不同的sheet表
dt=dataall.loc[dataall['渠道名称']==y] #筛选对应的渠道
dt.to_excel(writer,x) #写入
writer.save() #保存
好了,基本就是这样了,看看效果。
各个部门的工作薄
每个工作薄下有相关的表
可以看到效果很好。
后边想了想,还是有优化的空间比如,在循环里面频繁的读取文档,影响了一定的速度。可以先全部读取进来,建立个总的字典,再去一一筛选。这个后边再去优化了。
附上整体代码。
import numpy as np
import pandas as pd
#输入的excel文档名
a=input('目标工作表:')
out='C:UsershubiaoDesktop'+a+'.xlsx'
#获取工作薄所有表名
datashname=pd.read_excel(out,None)
sname=datashname.keys()
#通过工作薄的第一张表获取所有的渠道名称
qudao=pd.read_excel(out,sheet_name=0)['渠道名称'].value_counts().index
#分表
for y in qudao:
writer=pd.ExcelWriter('C:UsershubiaoDesktoppyexport'+y+'.xlsx')
for x in sname:
dataall=pd.read_excel(out,sheet_name=x)
dt=dataall.loc[dataall['渠道名称']==y]
dt.to_excel(writer,x)
writer.save()