0、序言
在工作中,我们经常遇到需要将excel表格中的内容按照条件拆分为多个表格,然后进行分发下去,比如考勤分发核查,薪资分发核查,销售预算拆分发出等等;同时很多时候也需要将收集回来的多个excel表格合并在excel中,在对汇总数据做进一步使用,比如各销售提供客户清单汇总,各部门提供的数据汇总,问卷调查答案汇总等等。这些需要拆分或者合并的操作需求几乎个个岗位都会用到,总经办,管理,运营,产品调研,财务等等,在数据量较小的时候我们可以手动,但数据量大的时候怎么办?手动需要耗费多少时间?所以今天我们就用python解决这个问题,将大量耗费时间的工作,通过代码自动实现,几个小时甚至更长时间的工作,自动搞定。当然有人说我不会python,没关系,首先代码简单,其次提供思想,最后每个公司数据人员基本上很少有不了解python的。
1、python条件拆分excel
案例:将【表2】中的内容,按照销售部门-销售名称,将每个部门的销售记录拆分为单个excel表。
拆分结果如下
代码如下
# -*- coding: utf-8 -*-
<span data-raw-text="" "="" data-textnode-index="7" data-index="462" style=";padding: 0px">"<span data-raw-text="" "="" data-textnode-index="7" data-index="463" style=";padding: 0px">"<span data-raw-text="" "="" data-textnode-index="7" data-index="464" style=";padding: 0px">"
create to 2020/07/18
@author:J_XR
<span data-raw-text="" "="" data-textnode-index="10" data-index="497" style=";padding: 0px">"<span data-raw-text="" "="" data-textnode-index="10" data-index="498" style=";padding: 0px">"<span data-raw-text="" "="" data-textnode-index="10" data-index="499" style=";padding: 0px">"
import numpy as np
import pandas as pd
def plit_excel_table():
data = pd.read_excel(path_read,sheet_name=sheet_name) #读取excel表格
rows = data.shape[0] #获取行数 shape[1]获取列数
Split_column_name_list = [] #创建一个用于存放拆分列名的列表
for i in range(rows): #循环遍历所有行
temp = data[Split_column_name2][i]+<span data-raw-text="" "="" data-textnode-index="39" data-index="799" style=";padding: 0px">"-<span data-raw-text="" "="" data-textnode-index="39" data-index="801" style=";padding: 0px">"+data[Split_column_name][i] #将需要用于做条件拆分的列连接起来
if temp not in Split_column_name_list:
Split_column_name_list.append(temp) #将用于拆分的列分类存在一个列表中
for Split_column in Split_column_name_list: #循环遍历存放好的条件拆分字段
new_df = pd.DataFrame() #新建二维表
#display(new_df) #查验表
for i in range (0, rows): #条件循环遍历原表,将相同条件的内容存在同一个DataFrame中
if data[Split_column_name2][i]+<span data-raw-text="" "="" data-textnode-index="72" data-index="1206" style=";padding: 0px">"-<span data-raw-text="" "="" data-textnode-index="72" data-index="1208" style=";padding: 0px">"+data[Split_column_name][i] == Split_column:
new_df = pd.concat([new_df, data.iloc[[i],:]], axis = 0, ignore_index = True)
#print(new_df) #输出查验结果
#将每个DataFrame写入一个新的excel中
new_df.to_excel(path_to_excel+str(Split_column)+<span data-raw-text="" "="" data-textnode-index="84" data-index="1465" style=";padding: 0px">".xlsx<span data-raw-text="" "="" data-textnode-index="84" data-index="1471" style=";padding: 0px">", sheet_name=str(Split_column), index = False)
if __name__ == <span data-raw-text="" "="" data-textnode-index="91" data-index="1543" style=";padding: 0px">"__main__<span data-raw-text="" "="" data-textnode-index="91" data-index="1552" style=";padding: 0px">":
path_read = r<span data-raw-text="" "="" data-textnode-index="94" data-index="1571" style=";padding: 0px">"E:/测试/data.xlsx<span data-raw-text="" "="" data-textnode-index="94" data-index="1587" style=";padding: 0px">" #读取的excel路径
sheet_name='表2' #读取excel的sheet_name
Split_column_name=<span data-raw-text="" "="" data-textnode-index="102" data-index="1685" style=";padding: 0px">"销售姓名<span data-raw-text="" "="" data-textnode-index="102" data-index="1690" style=";padding: 0px">" #条件拆分的列1-- 对应列名
Split_column_name2=<span data-raw-text="" "="" data-textnode-index="106" data-index="1738" style=";padding: 0px">"销售部门<span data-raw-text="" "="" data-textnode-index="106" data-index="1743" style=";padding: 0px">" # 条件拆分的列2 -- 对应列名
path_to_excel = r<span data-raw-text="" "="" data-textnode-index="110" data-index="1790" style=";padding: 0px">"E:/测试/拆分结果/<span data-raw-text="" "="" data-textnode-index="110" data-index="1802" style=";padding: 0px">" #拆分后存入的路径
plit_excel_table() #执行plit_excel_table
当然会代码的小伙伴都知道以上这段代码执行效率并不够,因为我们遍历了两次表,但拆分结果是达到了我们想要的结果,还有很多写法可以提高这个需求的效率,也欢迎看见的小伙伴,能写的将更优的代码留言分享给大家。
2、python合并excel
我们将上面拆分出来的三个表再合并在一起作为一个excel表格。
合并结果如下
代码如下
# -*- coding: utf-8 -*-
<span data-raw-text="" "="" data-textnode-index="121" data-index="2051" style=";padding: 0px">"<span data-raw-text="" "="" data-textnode-index="121" data-index="2052" style=";padding: 0px">"<span data-raw-text="" "="" data-textnode-index="121" data-index="2053" style=";padding: 0px">"
python合并excel表格
create to 2020/07/19
@author:J_XR
<span data-raw-text="" "="" data-textnode-index="125" data-index="2101" style=";padding: 0px">"<span data-raw-text="" "="" data-textnode-index="125" data-index="2102" style=";padding: 0px">"<span data-raw-text="" "="" data-textnode-index="125" data-index="2103" style=";padding: 0px">"
import glob
import pandas as pd
import numpy as np
import xlrd
import xlwt
def Merge_excel_table():
#首先查找默认文件夹下有多少文档需要整合
filearray=[]
for filename in glob.glob(filelocation+<span data-raw-text="" "="" data-textnode-index="153" data-index="2286" style=";padding: 0px">"*.<span data-raw-text="" "="" data-textnode-index="153" data-index="2289" style=";padding: 0px">"+fileform):
filearray.append(filename)
#以上是从pythonscripts文件夹下读取所有excel表格,并将所有的名字存储到列表filearray
print(filearray)
print(<span data-raw-text="" "="" data-textnode-index="160" data-index="2427" style=";padding: 0px">"文件夹下有%d个文档<span data-raw-text="" "="" data-textnode-index="160" data-index="2438" style=";padding: 0px">"%len(filearray))
ge=len(filearray)
matrix = [None]*ge # 生成含有len(filearray)个None元素的列表
#print(matrix)
#实现读写数据
#下面是将所有文件读数据到三维列表cell[][][]中(不包含表头)
for i in range(ge):
fname=filearray[i]
bk=xlrd.open_workbook(fname) #读取表格
sheets_names=bk.sheet_names() #获取所有工作簿列表
#print(sheets_names)
try:
sh=bk.sheet_by_name(sheets_names[sheetn]) #使用哪个工作簿,这里我们使用第一个工作簿<span data-raw-text="" "="" data-textnode-index="190" data-index="2863" style=";padding: 0px">"sheetn=0<span data-raw-text="" "="" data-textnode-index="190" data-index="2872" style=";padding: 0px">"
except:
print (<span data-raw-text="" "="" data-textnode-index="197" data-index="2908" style=";padding: 0px">"读取文件数据失败,要不你换换表格的名字?<span data-raw-text="" "="" data-textnode-index="197" data-index="2929" style=";padding: 0px">" %fname)
'''构建新的用于存放数据的表空间'''
nrows=sh.nrows #获取工作簿中有效行数
#print(nrows)
matrix[i] = [0]*(nrows-1)
#print(matrix[i])
ncols=sh.ncols
#print(ncols)
for m in range(nrows-1):
matrix[i][m] = [<span data-raw-text="" "="" data-textnode-index="223" data-index="3186" style=";padding: 0px">"0<span data-raw-text="" "="" data-textnode-index="223" data-index="3188" style=";padding: 0px">"]*ncols
#print(matrix[i][m])
'''向表空间中添加数据'''
for j in range(1,nrows):
for k in range(0,ncols):
matrix[i][j-1][k]=sh.cell(j,k).value
#print(matrix[i][j-1][k])
#下面是写数据到新的表格test.xls中哦
filename=xlwt.Workbook()
sheet=filename.add_sheet(Merge_sheet)
#下面是把表头写上
for i in range(0,len(biaotou)):
sheet.write(0,i,biaotou[i])
#求和前面的文件一共写了多少行
zh=1
for i in range(ge):
for j in range(len(matrix[i])):
for k in range(len(matrix[i][j])):
sheet.write(zh,k,matrix[i][j][k])
zh=zh+1
print(<span data-raw-text="" "="" data-textnode-index="290" data-index="3823" style=";padding: 0px">"已经将%d个文件合并成1个文件,并命名为%s.xls.打开查验!!!<span data-raw-text="" "="" data-textnode-index="290" data-index="3858" style=";padding: 0px">"%(ge,Merge_file))
filename.save(filedestination+Merge_file+<span data-raw-text="" "="" data-textnode-index="293" data-index="3922" style=";padding: 0px">".xls<span data-raw-text="" "="" data-textnode-index="293" data-index="3927" style=";padding: 0px">")
if __name__ == <span data-raw-text="" "="" data-textnode-index="297" data-index="3944" style=";padding: 0px">"__main__<span data-raw-text="" "="" data-textnode-index="297" data-index="3953" style=";padding: 0px">":
#在哪里搜索多个表格
filelocation=r<span data-raw-text="" "="" data-textnode-index="302" data-index="3988" style=";padding: 0px">"E:/测试/拆分结果/<span data-raw-text="" "="" data-textnode-index="302" data-index="4000" style=";padding: 0px">"
#当前文件夹下搜索的文件名后缀
fileform=<span data-raw-text="" "="" data-textnode-index="306" data-index="4034" style=";padding: 0px">"xlsx<span data-raw-text="" "="" data-textnode-index="306" data-index="4039" style=";padding: 0px">"
#读取需要合并的excel表的第几个工作簿,这里读取第1个
sheetn = 0
#获取列名用于作为合并表的列名称,可以根据自己的需求自定义
#biaotou=['客户编号','销售日期','销售部门','销售姓名','销售额','话费成本']
'''或者选择其中一个表的表头做为合并表的表头'''
#首先查找默认文件夹下有多少文档需要整合
filearray=[]
for filename in glob.glob(filelocation+<span data-raw-text="" "="" data-textnode-index="327" data-index="4296" style=";padding: 0px">"*.<span data-raw-text="" "="" data-textnode-index="327" data-index="4299" style=";padding: 0px">"+fileform):
filearray.append(filename)
#以上是从pythonscripts文件夹下读取所有excel表格,并将所有的名字存储到列表filearray
df = pd.read_excel(filearray[0],sheet_name= 0)
biaotou = list(df.columns.values)
print(biaotou) #输出表头
#将合并后的表格存放到的位置
filedestination=r<span data-raw-text="" "="" data-textnode-index="344" data-index="4563" style=";padding: 0px">"E:/测试/拆分结果/<span data-raw-text="" "="" data-textnode-index="344" data-index="4575" style=";padding: 0px">"
#合并后的表格命名为file
Merge_file=<span data-raw-text="" "="" data-textnode-index="348" data-index="4610" style=";padding: 0px">"合并表<span data-raw-text="" "="" data-textnode-index="348" data-index="4614" style=";padding: 0px">"
#合并后的表格工作簿命名为sheet
Merge_sheet=<span data-raw-text="" "="" data-textnode-index="353" data-index="4654" style=";padding: 0px">"合并结果<span data-raw-text="" "="" data-textnode-index="353" data-index="4659" style=";padding: 0px">"
#执行
Merge_excel_table()
欢迎阅读到的小伙伴留言更优化的代码分享给大家,一起学习进步!!!