python自动化办公——合并多个Excel文件

最近给老师汇总研究生民工们收集的数据时发现数据量一大Excel就罢工了,干脆写了个脚本,只需要将字段名一致的Excel放到一个文件夹里,在脚本中输入文件夹的路径就可以了。完整代码奉上!
案例数据长这样,每个Excel里有3-4个子表
数据解释:文件夹中包含两个Excel文件,其中每个Excel文件又包含多个子表,每个子表的字段名称完全一致。

  1. 导入用来读取和写入Excel的包:
import xlrd
import xlsxwriter
import os
  1. 自定义函数(思路)
    1.获得目标文件夹中所有Excel的表名
    2.遍历文件夹中的Excel表
    3.获得每个Excel子表的个数
    4.遍历子表
    5.获取子表中数据的行数
    6.按行读取子表内容并拼接到空的列表
    7.创建新的sheet对象,创建子表,根据位置索引写入拼接后的数据
#获取文件目录
def get_catalog(path):
    catlog=[]    
    files=os.listdir(path) #列出文件夹中的所有excel的名字
    for i in files:
        catlog.append('C:/Users/AtlasWong/Desktop/test/'+i) #文件路径为:文件夹路径+表的名字
    return catlog


#打开一个excel工作表
def open_xls(file):
    fh = xlrd.open_workbook(file)
    return fh

#获取excel中所有的sheet子表
def getsheet(fh):
    return fh.sheets()

#获取sheet表的个数
def getshnum(fh):
    x = 0
    sh = getsheet(fh)
    for sheet in sh:
        x += 1
    return x

#获取sheet表的行数
def getnrows(fh, sheet):
    table = fh.sheets()[sheet]
    return table.nrows

# 读取文件内容并返回行内容
def getFilect(file, shnum):
    fh = open_xls(file)        #打开一个工作表
    table = fh.sheets()[shnum] #通过子表的索引定位到当前子表
    num = table.nrows          #字表的行数
    for row in range(num):     #将每一行数据拼接到空表中
        rdata = table.row_values(row)  
        datavalue.append(rdata)
    return datavalue
  1. 输入目标文件夹的路径:
path='C:/Users/AtlasWong/Desktop/test'
  1. 执行主函数:
if __name__ == '__main__':

    allxls = get_catalog(path)# 定义要合并的excel文件列表
    datavalue = [] # 存储所有读取的结果
    
    #读取文件
    for fl in allxls:
        fh = open_xls(fl)
        x = getshnum(fh)
        for shnum in range(x):
            print("正在读取文件:"+str(fl)+"的第"+str(shnum)+"个sheet表的内容...")
            rvalue = getFilect(fl, shnum)

    # 定义最终合并后生成的新excel文件
    endfile = 'C:/Users/AtlasWong/Desktop/test/excel3.xlsx'
    final_sheet = xlsxwriter.Workbook(endfile)  # 创建一个sheet工作对象
    sub_sheet = final_sheet.add_worksheet()  # 在final_sheet中新建一个子表
    for a in range(len(rvalue)):
        for b in range(len(rvalue[a])):
            c = rvalue[a][b]
            sub_sheet.write(a, b, c)  #在相应位置写入数据
    final_sheet.close()
    print("文件合并完成")
  1. 执行结果:
正在读取文件:C:/Users/AtlasWong/Desktop/test/1.xlsx的第0个sheet表的内容...
正在读取文件:C:/Users/AtlasWong/Desktop/test/1.xlsx的第1个sheet表的内容...
正在读取文件:C:/Users/AtlasWong/Desktop/test/1.xlsx的第2个sheet表的内容...
正在读取文件:C:/Users/AtlasWong/Desktop/test/1.xlsx的第3个sheet表的内容...
正在读取文件:C:/Users/AtlasWong/Desktop/test/2.xlsx的第0个sheet表的内容...
正在读取文件:C:/Users/AtlasWong/Desktop/test/2.xlsx的第1个sheet表的内容...
文件合并完成

如果Excel中没有子表的话,其实还有种简单的做法就是将每个Excel读取为一个dataframe,然后用concat函数拼接起来再输出,这段代码更加简短一些。

import os
#获取文件目录
files=os.listdir(r'C:/Users/AtlasWong/Desktop/test')
files

df=[]
import pandas as pd
for i in files:
    df.append(pd.read_excel('C:/Users/AtlasWong/Desktop/test/'+i))
#将多个df拼接在一起
res=pd.concat(df)
res.to_excel(r'C:\Users\AtlasWong\Desktop\test\result.xlsx', index=False)

Python对于编程小白来说是相当友好的了,卷不过那些熬夜加班狗,那就学习一些Python自动化办公的技术,躺着卷吧。

想了解更多Python自动化操作Excel的知识,可以戳这里https://zhuanlan.zhihu.com/p/259583430

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值