Python实现多个Excel文件合并到一个文件中
利用Python合并excel文件,思路很简单:1.选择所要合并的文件所在的文件夹;2.筛选出后缀为xls的文件;3.扫描所有excel文件的每一个sheet,将得到的数据存在list列表中;4.将所有sheet的数据写到当前文件夹中,并命名为final.xlsx
目录
前言
笔者最近开始学习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中收集的数据存入到新建的文件夹中
截图如下:
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的数据,如下图所示:
其中,行数为所有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行
更多推荐
所有评论(0)