如何用python將文件夾內(nèi)多個(gè)excel表格合并成總表
前言:
本文講述使用python將需要處理的文件夾內(nèi)多個(gè)excel文件內(nèi)容進(jìn)行合并,并輸出為xlsx格式的總表。就比如一個(gè)文件夾里又有許多子文件夾,這些子文件夾里分布有excel文件,這里的python文件就能將這個(gè)文件夾內(nèi)的所有excel文件進(jìn)行合并成總表,不管里面是否還有其他文件格式就比如dox、jpg、py等,更不用說這個(gè)文件夾內(nèi)只含有excel文件。
本文還使用了GUI界面使操作更加簡(jiǎn)潔,并介紹了將其打包成exe可執(zhí)行文件的步驟,讓它使用的更廣泛了。由于進(jìn)行了模塊化設(shè)計(jì),各個(gè)步驟使用了函數(shù)封裝。
1.引入庫(kù):
需要引入5個(gè)庫(kù),分別如下。其中xlrd庫(kù)是用于xls格式的讀取,openpyxl庫(kù)是用于xlsx格式的讀取,而openpyxl庫(kù)既可以用于xls格式的寫入,又可以用于xlsx格式的寫入。os是操作系統(tǒng)的庫(kù),python自帶庫(kù)。tkinter是GUI界面的庫(kù),其中filedialog是tkinter中的文件對(duì)話框,它的作用類似我們下載一個(gè)東西需選擇下在哪個(gè)地方的界面。
import xlrd import os import openpyxl import tkinter as tk import tkinter.filedialog
獲取excel文件的路徑:
這一部分總的代碼如下。
import xlrd import os import openpyxl import tkinter as tk import tkinter.filedialog
然后分開來單獨(dú)看各個(gè)代碼的作用
filename = 'C:/Users/86182/Desktop/需要處理的文件夾'
for root, dirs, files in os.walk('{}'.format(filename)):
print(root)
print(files)filename為需要處理的文件夾的絕對(duì)路徑,就比如C:/Users/86182/Desktop/需要處理的文件夾,可以自己查看自己電腦某個(gè)文件的路徑,這里使用filename是為了之后與其它模塊銜接??梢钥聪螺敵龅慕Y(jié)果:

這串代碼的作用是遍歷需要處理文件夾內(nèi)所有文件,root的作用是返回文件的路徑,而file的作用是以列表形式返還文件名。父文件夾’需要處理的文件夾‘內(nèi)只有兩個(gè)子文件夾,分別為’戰(zhàn)斗師‘,’魔法師‘。戰(zhàn)斗師文件夾里有'戰(zhàn)斗師相關(guān).doc', '戰(zhàn)斗師相關(guān)數(shù)據(jù).xlsx'這兩個(gè)文件。魔法師文件夾里有'魔法師相關(guān).doc', '魔法師相關(guān)數(shù)據(jù).xls'這兩個(gè)文件,直觀如下。注意對(duì)于root,需要處理的文件夾\戰(zhàn)斗師,中間是反斜杠\與其他不同,后面會(huì)利用這個(gè)性質(zhì)。

接下來:
root_files_Global = []
def find_excel():#定義獲取excel文件路徑
for root, dirs, files in os.walk('{}'.format(filename)):
for i in range(len(files)):
if 'xls' in files[i] or 'xlsx' in files[i]:
root_files_Global.append(root+'/'+files[i])
find_excel()
print(root_files_Global)對(duì)于for i in range(len(files))循環(huán)下,如果files列表內(nèi)第i個(gè)元素中有'xls'、'xlsx'字符串在內(nèi)(即判斷excel文件),則在root_files_Global列表內(nèi)添加文件的路徑加名稱。這樣在整個(gè)循環(huán)內(nèi),就能把需要處理的文件夾內(nèi)的所有excel文件的路徑加名稱全部添加到root_files_Global列表內(nèi)。可以看一下這一部分運(yùn)行的結(jié)果:

3.對(duì)excel文件內(nèi)容的讀取
由于對(duì)excel文件的讀取分xls與xlsx格式的讀取,所以需要分別引用xlrd庫(kù)與openpyxl庫(kù),不過他們讀取內(nèi)容的過程相似,可以仿照。這一部分的總代碼如下:
row = []
column = []
value = []
f0 = 0
def read_excel_xls():#定義讀取xls文件格式函數(shù)
global f0
wb = xlrd.open_workbook(root_files_Global[t])
sheet_names = wb.sheet_names()
sheet = wb.sheet_by_name(sheet_names[0])
for r in range(sheet.nrows):
for c in range(sheet.ncols):
va = sheet.cell(r, c).value
row.append(r+f0)
column.append(c)
value.append(va)
f0 = f0 + sheet.nrows
def read_excel_xlsx():#定義讀取xlsx文件格式的函數(shù),使用openpyxl
global f0
wb = openpyxl.load_workbook(root_files_Global[t])
ws = wb.worksheets[0]
for r in range(ws.max_row):
for c in range(ws.max_column):
va = ws.cell(r+1, c+1).value
row.append(r + f0)
column.append(c)
value.append(va)
f0 = f0 + ws.max_row這一部分我們就主要看read_excel_xls()這個(gè)定義的函數(shù),read_excel_xlsx()可以仿照。9-11行作用是打開excel表格內(nèi)第一個(gè)sheet表格(具體可以查看xlrd庫(kù)相關(guān)內(nèi)容)。sheet.nrows表示表格的行數(shù),sheet.ncols表示表格的列數(shù),第24行至25行表示在每一行遍歷每一列;va = ws.cell(r+1, c+1).value的作用為獲取第r+1行、c+1列的內(nèi)容并返還對(duì)象va。將內(nèi)容行數(shù)信息和列數(shù)信息分別儲(chǔ)存在row=[]、column=[]這兩個(gè)列表里,將內(nèi)容信息儲(chǔ)存在value=[]列表里。這里f0的使用是比較重要的,如果沒有f0,當(dāng)循環(huán)到下一個(gè)文件,行數(shù)與列數(shù)的信息就又重0開始了,而我們之后需要寫入一個(gè)總表,行數(shù)信息就應(yīng)該自上個(gè)文件的最大行數(shù)再往下。f0的作用就是讓行數(shù)信息接著往下。
為了使按照順序讀取多個(gè)excel文件,可以使用如下代碼:
for t in range(len(root_files_Global)):
if 'xlsx' in root_files_Global[t]:
read_excel_xlsx()
elif 'xls' in root_files_Global[t]:
read_excel_xls()4.寫入excel總表
這一部分就比較簡(jiǎn)單了,總的代碼如下:
def write_excel_xlsx():#定義寫入xlsx文件格式的函數(shù),使用openpyxl
wb = openpyxl.Workbook()
ws = wb.worksheets[0]
for i in range(len(row)):
ws.cell(row[i]+1,column[i]+1).value = value[i]
wb.save('總表.xlsx')openpyxl.Workbook()創(chuàng)建一個(gè)xlsx格式excel文件并返還wb對(duì)象,打開這個(gè)文件的第一個(gè)sheet表格,第4行到第5行代碼為按照行的信息和數(shù)的信息寫入內(nèi)容,wb.save('總表.xlsx')最后保存總表。
到這里大致python代碼就完成了。接下來引入GUI、打包exe可執(zhí)行化文件。
5.設(shè)置GUI界面
這一步分總的代碼如下:
def askfile():#選擇文件夾
global filename
filename = tk.filedialog.askdirectory()
if filename !='':
label2.config(text=filename)
print(filename)
else:
label2.config(text='您沒有選擇任何文件夾')
def GUI_excel():
global label2
window = tk.Tk()
window.geometry('600x300')
window.title('excel合成')
label1 = tk.Label(window,text='請(qǐng)選擇需要處理的文件夾,選擇好就已經(jīng)處理完畢,如需重新處理,刪除合成好的表并重新啟動(dòng)程序')
label1.place(x=15,y=10)
label2 = tk.Label(window,text='')
label2.place(x=15,y=30)
button1 = tk.Button(window,text='選擇文件夾',bg='blue',fg='white',command=askfile())
button1.place(x=15,y=60)
window.mainloop()window = tk.Tk()
window.geometry('600x300')
window.title('excel合成')
這三行代碼用于創(chuàng)建一個(gè)大小為’600*300‘GUI界面,標(biāo)題名稱為excel合成,label1是一個(gè)標(biāo)簽用為提示相關(guān)信息,label2主要是為了搭配askfile()函數(shù)使用。
再設(shè)置一個(gè)按鈕button1,它的功能就是askfile(),而askfile()的作用類似我們下載一個(gè)東西需選擇下在哪個(gè)地方的界面,就如下:

到現(xiàn)在所有代碼都已經(jīng)完成,我把總的代碼寫在下面,需要自?。?/p>
#只針對(duì)sheet1/支持xls、xlsx/最后輸出xlsx格式總表
#可以修改文件價(jià)名稱/匯總xls、xlsx表格
import xlrd
import os
import openpyxl
import tkinter as tk
import tkinter.filedialog
root_files_Global = []
row = []
column = []
value = []
f0 = 0
def askfile():#選擇文件夾
global filename
filename = tk.filedialog.askdirectory()
if filename !='':
label2.config(text=filename)
print(filename)
else:
label2.config(text='您沒有選擇任何文件夾')
def GUI_excel():
global label2
window = tk.Tk()
window.geometry('600x300')
window.title('excel合成')
label1 = tk.Label(window,text='請(qǐng)選擇需要處理的文件夾,選擇好就已經(jīng)處理完畢,如需重新處理,刪除合成好的表并重新啟動(dòng)程序')
label1.place(x=15,y=10)
label2 = tk.Label(window,text='')
label2.place(x=15,y=30)
button1 = tk.Button(window,text='選擇文件夾',bg='blue',fg='white',command=askfile())
button1.place(x=15,y=60)
window.mainloop()
GUI_excel()
def find_excel():#定義獲取excel文件路徑
for root, dirs, files in os.walk('{}'.format(filename)):
for i in range(len(files)):
if 'xls' in files[i] or 'xlsx' in files[i]:
root_files_Global.append(root+'/'+files[i])
find_excel()
print(root_files_Global)
def read_excel_xls():#定義讀取xls文件格式函數(shù)
global f0
wb = xlrd.open_workbook(root_files_Global[t])
sheet_names = wb.sheet_names()
sheet = wb.sheet_by_name(sheet_names[0])
for r in range(sheet.nrows):
for c in range(sheet.ncols):
va = sheet.cell(r, c).value
row.append(r+f0)
column.append(c)
value.append(va)
f0 = f0 + sheet.nrows
def read_excel_xlsx():#定義讀取xlsx文件格式的函數(shù),使用openpyxl
global f0
wb = openpyxl.load_workbook(root_files_Global[t])
ws = wb.worksheets[0]
for r in range(ws.max_row):
for c in range(ws.max_column):
va = ws.cell(r+1, c+1).value
row.append(r + f0)
column.append(c)
value.append(va)
f0 = f0 + ws.max_row
for t in range(len(root_files_Global)):
if 'xlsx' in root_files_Global[t]:
read_excel_xlsx()
elif 'xls' in root_files_Global[t]:
read_excel_xls()
def write_excel_xlsx():#定義寫入xlsx文件格式的函數(shù),使用openpyxl
wb = openpyxl.Workbook()
ws = wb.worksheets[0]
for i in range(len(row)):
ws.cell(row[i]+1,column[i]+1).value = value[i]
wb.save('總表.xlsx')
write_excel_xlsx()6.打包成exe可執(zhí)行文件
如果直接使用install進(jìn)行打包會(huì)使壓縮包達(dá)到兩、三百兆的樣子。傳輸起來會(huì)非常不方便。所以這里需要python創(chuàng)建虛擬環(huán)境,由于我使用的是Anaconda,所以在這里只介紹相關(guān)內(nèi)容,大家可以上網(wǎng)搜如何下載,這里我就不過多介紹了。
先介紹幾個(gè)conda命令
conda create -n 虛擬環(huán)境名字 python==3.1 #創(chuàng)建虛擬環(huán)境
conda activate 虛擬環(huán)境名字 #激活虛擬環(huán)境
conda deactivate #退出虛擬環(huán)境
下載好后,從開始菜單運(yùn)行“Anaconda Prompt”,使用上述第一個(gè)命令創(chuàng)建名為‘excel’的虛擬環(huán)境,如下:

在創(chuàng)建過程中需要回復(fù)(y/n),Yes,再激活虛擬環(huán)境

使用conda activate 虛擬環(huán)境名字 #激活虛擬環(huán)境,剛剛我們創(chuàng)建的虛擬環(huán)境名字為excel,結(jié)果如下:

這樣就代表激活好了,現(xiàn)在可以使用conda list來看下這個(gè)虛擬環(huán)境所安裝的一些庫(kù):

由于我們腳本還需要使用xlrd、openpyxl這兩個(gè)庫(kù),而tkinter庫(kù)和os庫(kù)是python自帶庫(kù),所以只需要將這兩個(gè)庫(kù)加載到虛擬環(huán)境中,當(dāng)然還必不可打包的庫(kù)pyinstaller;使用如下安裝庫(kù)(直接輸入就好):
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xlrd
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple openpyxl
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller

現(xiàn)在我已經(jīng)安裝好了。現(xiàn)在只需你新建個(gè)文件夾,將py文件放進(jìn)去,在進(jìn)行如下操作就好了

我的py文件名稱為excel合成,并將它放在了excel合成總表這個(gè)文件夾里了,
所以cd C:/Users/86182/Desktop/excel合成總表這邊轉(zhuǎn)到自己的路徑就好了,這樣文件就打包好了,可執(zhí)行化文件在剛剛那個(gè)文件夾中的dist里面

到現(xiàn)在就結(jié)束了。
總結(jié):
雖然此方法將多個(gè)excel表格內(nèi)的內(nèi)容進(jìn)行了合并,但是還存在一個(gè)問題就是,并不能將excel的格式一起合并起來,不過后面我會(huì)在學(xué)習(xí)以下,看能不能解決。
到此這篇關(guān)于如何用pyhton將文件夾內(nèi)多個(gè)excel表格合并成總表的文章就介紹到這了,更多相關(guān)pyhton將多個(gè)excel表格合并內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python之Django自動(dòng)實(shí)現(xiàn)html代碼(下拉框,數(shù)據(jù)選擇)
這篇文章主要介紹了Python之Django自動(dòng)實(shí)現(xiàn)html代碼(下拉框,數(shù)據(jù)選擇),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Blender?Python編程實(shí)現(xiàn)批量導(dǎo)入網(wǎng)格并保存渲染圖像
這篇文章主要為大家介紹了Blender?Python?編程實(shí)現(xiàn)批量導(dǎo)入網(wǎng)格并保存渲染圖像示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
Python數(shù)據(jù)清洗之抽取jsonl文件數(shù)據(jù)字段并合并
這篇文章主要為大家詳細(xì)介紹了Python數(shù)據(jù)清洗之抽取jsonl文件數(shù)據(jù)字段并合并的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2025-03-03
python使用knn實(shí)現(xiàn)特征向量分類
這篇文章主要為大家詳細(xì)介紹了python使用knn實(shí)現(xiàn)特征向量分類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
Pytest單元測(cè)試框架生成HTML測(cè)試報(bào)告及優(yōu)化的步驟
本文主要介紹了Pytest單元測(cè)試框架生成HTML測(cè)試報(bào)告及優(yōu)化的步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01

