查看源图像

 

目录

前言

一、完整代码

二、代码讲解

1 引入库

2 选择待合并文件所在的文件夹

3 读取所在文件夹中的xls文件,并进行合并

3.1 打开文件

3.2 获取excel文件信息

3.3 读取所有文件的所有数据

3.4 将读取的文件写入到新文件中

三、总结


前言

        笔者最近开始学习Python语言,简单记录一下自己做的一个小作业:利用Python合并excel文件。思路很简单:1.选择所要合并的文件所在的文件夹;2.筛选出后缀为xls的文件(由于xlrd的最新版本仅支持xls文件,xlsx不再支持,因此这里我们干脆就用xls文件进行实验。童鞋们也可以直接将xlrd回退到1.2.0版本,操作如下👇);3.扫描所有excel文件的每一个sheet,将得到的数据存在list列表中;4.将所有sheet的数据写到当前文件夹中,并命名为final.xlsx(这里为啥又用xlsx了?1.便于和待合并的文件进行区分2.xlsxwriter这个库生成的文件就是xlsx)

        如果觉得本文不错,请一键三连,哈哈哈哈哈哈哈哈哈哈。  

pip uninstall xlrd

pip install xlrd==1.2.0

一、完整代码

        第一步,直接上代码:

import tkinter as tk
from tkinter import filedialog
import os
import xlrd  #读取Excel文件的包
import xlsxwriter   #将文件写入Excel的包


#打开excel
def OpenExcel(Filepath):
    try:
        file=xlrd.open_workbook(Filepath)
        return file
    except Exception as e:
        print(e)
#获取Excel中所有的sheet
def GetAllSheets(file):
    return file.sheets()

#获取某个sheet表的行数
def GetAllRows(table):
    return table.nrows

#读取文件内容
def GetContent(excel,sheetNo):
    content=list()
    try:
        sheets=GetAllSheets(excel)
        table=sheets[sheetNo]
    except Exception as e:
        print(e)
    rows=GetAllRows(table)
    for i in range(rows):
        data=table.row_values(i)#第i行的数据
        content.append(data)
    return content

#所有的Excel的所有sheets变成一个sheet
def Sum1(fileName,data):
    '''
    将所有文件的sheet整合到一个sheet中
    '''
    finalFile=xlsxwriter.Workbook(fileName)#创建一个工作表文件
    sheet=finalFile.add_worksheet()#添加一个sheet
    count=0
    for sheetId in range(len(data)):
        for row in range(len(data[sheetId])):
             for col in range(len(data[sheetId][row])):
                d=data[sheetId][row][col]
                sheet.write(count,col,d)
             count=count+1
    finalFile.close()

if __name__=='__main__':
'''打开选择文件夹对话框'''
    root = tk.Tk()
    root.withdraw()
    folderPath = filedialog.askdirectory() #获得选择好的文件夹
    #Filepath = filedialog.askopenfilename() #获得选择好的文件
    data=list()
    fileSet=os.listdir(folderPath)
    for file in fileSet:
        if file.endswith('.xls'):
            try:
                excel=OpenExcel(folderPath+'/'+file)
            except Exception as e:
                print(e)
            sheets=GetAllSheets(excel)
            for i in range(len(sheets)):
                data.append(GetContent(excel,i))
                
    fileName=str('/final.xlsx')
    finalFilePath=folderPath+fileName
    Sum1(finalFilePath,data)

二、代码讲解

1 引入库

        代码如下(示例):

import tkinter as tk           #选择文件夹功能用到的库
from tkinter import filedialog #弹出文件框,选择需要合并的文件所在的文件夹
import os                      #扫描文件夹中的文件用到的库
import xlrd                    #读取Excel文件的包
import xlsxwriter              #将文件写入Excel的包

2 选择待合并文件所在的文件夹

        代码如下(示例):

root = tk.Tk()                         #初始化弹出文件库所需要的库
root.withdraw()                        #不加这个选择框消失不了
folderPath = filedialog.askdirectory() #获得选择好的文件夹

        截图如下:

选择文件夹操作

        1) 这里加上异常处理会更好,这里如果取消选择文件夹,会报错;

        2) 若是手写文件路径,记得将D:\test.txt这样的路径改为D:\\test.txt或者D:/test.txt。

3 读取所在文件夹中的xls文件,并进行合并

data=list()                      #声明一个list变量,用来存数据,也可以用data=[]来初始化
fileSet=os.listdir(folderPath)   #扫描所选文件夹中所有文件
for file in fileSet:
    if file.endswith('.xls'):    #选择xls文件进行后续操作
        try:
            excel=OpenExcel(folderPath+'/'+file)  #打开文件
        except Exception as e:
            print(e)             #异常处理,避免程序无脑崩溃:如果打开失败就打印失败信息
        sheets=GetAllSheets(excel)            #获取excel文件中所有sheet
        for i in range(len(sheets)):          #对每个sheet进行数据提取
            data.append(GetContent(excel,i))  #使用append方法将所有数据存起来

fileName=str('/final.xlsx')         #给汇总文件命名
finalFilePath=folderPath+fileName   #给文件名加上文件目录,这样汇总文件就出现在当前目录了
Sum1(finalFilePath,data)            #将data中收集的数据存入到新建的文件夹中

        截图如下: 

sheet1数据
sheet1数据
sheet2数据
sheet2数据
合并后的数据
合并后的数据

 

test文件夹
test文件夹中的文件

3.1 打开文件

        根据文件路径,利用xlrd库的open_workbook函数打开excel文件,如果操作失败则打印失败信息:

#打开excel
def OpenExcel(Filepath):
    try:
        file=xlrd.open_workbook(Filepath)
        return file
    except Exception as e:
        print(e)

3.2 获取excel文件信息

        获取每个excel文件的所有sheet,每个sheet中有多少行也要获知。(这两个函数功能简单,可以不用封装为函数,这么做可以增加可读性);

#获取Excel中所有的sheet
def GetAllSheets(file):
    return file.sheets()

#获取某个sheet表的行数
def GetAllRows(table):
    return table.nrows

3.3 读取所有文件的所有数据

        依次读取所有文件的所有sheet表单,将数据进行存储

#读取文件内容
def GetContent(excel,sheetNo):
    content=list()                  #声明一个变量,用于存数据
    try:
        sheets=GetAllSheets(excel)  #对每个excel文件,获知它sheet的数量
        table=sheets[sheetNo]       #对某个sheet进行操作
    except Exception as e:            #异常处理
        print(e)                      #打印异常信息
    rows=GetAllRows(table)          #某个sheet表格的行数
    for i in range(rows):           #对每一行数据进行如下操作
        data=table.row_values(i)    #提取该行的数据
        content.append(data)        #将提取的数据存在list列表中
    return content                  #操作完成后,将提取的数据进行返回

3.4 将读取的文件写入到新文件中

#所有的Excel的所有sheets变成一个sheet
def Sum1(fileName,data):
    '''
    将所有文件的sheet整合到一个sheet中
    '''
    finalFile=xlsxwriter.Workbook(fileName)    #创建一个工作表文件
    sheet=finalFile.add_worksheet()            #为该工作表添加一个sheet
    count=0                                    #由于每个sheet的数据数目不一样,因此需要计数

    '''每个sheet表中的数据在data中为一行数据,有多少行就一共有多少个sheet表格'''                             
    for sheetId in range(len(data)):
        '''data中的每一行的列数相当于原表单中的行数'''
        for row in range(len(data[sheetId])):
             '''data的最小单位便是原sheet表单中的一行数据,这里
                获取原表中每一行有多少列数据
             '''
             for col in range(len(data[sheetId][row])):
                d=data[sheetId][row][col]       #提取数据
                sheet.write(count,col,d)        #将数据存入新文件中 <行,列,数据>
             count=count+1                      #汇总文件中的行数+1

    finalFile.close()                           #文件要进行关闭

        为了方便读者理解,这里贴出data的数据,如下图所示:

data列表中的数据
data变量中第一行数据对应的excel

 

       

        其中,行数为所有excel文件中sheet的总数,每一行数据为原excel文件中整个sheet的数据,每一个单元格中的数据为原sheet中一行的数据。


 

三、总结

        本博客仅对最近的学习成果进行总结,使用的读写excel文件的库是网上一搜就看到的方法,至于有没有更好的,大家可以根据自身需要自行阅读(可能是全网最完整的 Python 操作 Excel库总结!)。

        另外,网上有所谓的9行代码合并excel,笔者运行后,发现他只支持单sheet的场景,其代码如下(做了部分改进,添加了选择文件夹的功能。没加注释的部分为笔者自己添加的代码),由于笔者仅是初学者,尚未了解以下代码中line3-line7的语法规则,待深入了解后再进行改进:

import os                                                 #第1行
import pandas as pd                                       #第2行
import tkinter as tk
from tkinter import filedialog
root = tk.Tk()
root.withdraw()
folderPath = filedialog.askdirectory()
excels=[                                                  #第3行
    pd.read_excel(folderPath+'/'+fname,engine='openpyxl') #第4行
    for fname in os.listdir(folderPath)                   #第5行
    if '.xls' in fname                                    #第6行
]                                                         #第7行
df=pd.concat(excels)                                      #第8行
df.to_excel(folderPath+'/result.xlsx',index=False)        #第9行
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐