python条件拆分excel和合并excel_搜索

0、序言

在工作中,我们经常遇到需要将excel表格中的内容按照条件拆分为多个表格,然后进行分发下去,比如考勤分发核查,薪资分发核查,销售预算拆分发出等等;同时很多时候也需要将收集回来的多个excel表格合并在excel中,在对汇总数据做进一步使用,比如各销售提供客户清单汇总,各部门提供的数据汇总,问卷调查答案汇总等等。这些需要拆分或者合并的操作需求几乎个个岗位都会用到,总经办,管理,运营,产品调研,财务等等,在数据量较小的时候我们可以手动,但数据量大的时候怎么办?手动需要耗费多少时间?所以今天我们就用python解决这个问题,将大量耗费时间的工作,通过代码自动实现,几个小时甚至更长时间的工作,自动搞定。当然有人说我不会python,没关系,首先代码简单,其次提供思想,最后每个公司数据人员基本上很少有不了解python的。

1、python条件拆分excel

案例:将【表2】中的内容,按照销售部门-销售名称,将每个部门的销售记录拆分为单个excel表。

python条件拆分excel和合并excel_excel表格_02

拆分结果如下

python条件拆分excel和合并excel_python_03

python条件拆分excel和合并excel_搜索_04

代码如下

# -*- 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表格。

python条件拆分excel和合并excel_搜索_05

合并结果如下

python条件拆分excel和合并excel_python_06

代码如下

# -*- 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()

欢迎阅读到的小伙伴留言更优化的代码分享给大家,一起学习进步!!!