手把手教你4種方法用Python批量實(shí)現(xiàn)多Excel多Sheet合并
回復(fù)“書籍”即可獲贈(zèng)Python從入門到進(jìn)階共10本電子書
一、前言
大家好,我是崔艷飛。前兩天給大家分享了Python自動(dòng)化文章:手把手教你利用Python輕松拆分Excel為多個(gè)CSV文件,而后在Python進(jìn)階交流群里邊有讀者遇到一個(gè)問題,他有很多個(gè)Excel表格,他需要對(duì)這些Excel文件進(jìn)行合并。

誠(chéng)然,一個(gè)一個(gè)打開復(fù)制粘貼固然可行,但是該方法費(fèi)時(shí)費(fèi)力,還容易出錯(cuò),幾個(gè)文件還可以手動(dòng)處理,要是幾十個(gè)甚至上百個(gè),你就抓瞎了,不過這問題對(duì)Python來說,so easy,一起來看看吧!
二、項(xiàng)目目標(biāo)
用Python實(shí)現(xiàn)多Excel、多Sheet的合并處理。
三、項(xiàng)目準(zhǔn)備
軟件:PyCharm
需要的庫(kù):pandas, xlrd,os
四、項(xiàng)目分析
1)如何選擇要合并的Excel文件?
利用os,獲取所有要合并的Excel文件。
2)如何選擇要合并的Sheet?
利用xlrd庫(kù)進(jìn)行Excel讀取,獲取要合并的Sheet名。
3)如何合并?
利用pandas庫(kù),對(duì)所有Sheet名逐一循環(huán)打開,通過concat()進(jìn)行數(shù)據(jù)追加合并即可。
4)如何保存文件?
利用to_excel保存數(shù)據(jù),得到最終合并后的目標(biāo)文件。
五、項(xiàng)目實(shí)現(xiàn)
1、第一步導(dǎo)入需要的庫(kù)
import pandas as pdimport xlrdimport os
2、第二步選擇要合并的Excel文件
#要合并文件路徑path="D:/b/"#獲取文件夾下所有EXCEL名xlsx_names = [x for x in os.listdir(path) if x.endswith(".xlsx")]
3、第三步選擇要合并的Sheet
# 獲取第一個(gè)EXCEL名xlsx_names1 = xlsx_names[0]aa = path + xlsx_names1#打開第一個(gè)EXCELfirst_file_fh=xlrd.open_workbook(aa)# 獲取SHEET名first_file_sheet=first_file_fh.sheets()
4、第四步對(duì)Sheet內(nèi)容進(jìn)行循環(huán)合并
#按SHEET名循環(huán)for sheet_name in sheet_names:df = None# 按EXCEL名循環(huán)for xlsx_name in xlsx_names:sheet_na = pd.ExcelFile(path + xlsx_name).sheet_namesif sheet_name in sheet_na:#print(sheet_name)_df = pd.read_excel(path + xlsx_name, sheet_name=sheet_name,header=None)if df is None:df = _dfelse:df = pd.concat([df, _df], ignore_index=True)else:continue
5、第五步保存合并后的文件
df.to_excel(excel_writer=writer, sheet_name=sheet_name, encoding="utf-8", index=False)print(sheet_name + " 保存成功!共%d個(gè),第%d個(gè)。" % (len(sheet_names),num))num += 1writer.save()writer.close()
六、效果展示
1、處理前Excel數(shù)據(jù):

2、運(yùn)行進(jìn)度提示:

3、合并后的結(jié)果:

七、總結(jié)
本文介紹了如何利用Python對(duì)多個(gè)Excel文件、多Sheet進(jìn)行合并處理,減少了很多復(fù)制粘貼的麻煩,省時(shí)省力,還不容易出錯(cuò),代碼不多,循環(huán)追加有點(diǎn)繞,想想也就明白了,不懂的隨時(shí)留言提問,大家一起學(xué)習(xí)進(jìn)步。
有想法的小伙伴還可以將文章中的代碼進(jìn)行打包,做成一個(gè)exe可執(zhí)行的小軟件,包裝好發(fā)給別人使用,也可以賺點(diǎn)小費(fèi)噢,關(guān)于打包的教程這里不再贅述,歡迎前往:三個(gè)你必須要記住的Pyinstaller打包命令——利用Python實(shí)現(xiàn)打包exe。
八、彩蛋
下面兩份代碼是群內(nèi)小伙伴提供了,小編也自行測(cè)試了下,親測(cè)有效,歡迎大家積極嘗試噢!
來自群友Jayson的代碼:
# -*- coding: utf-8 -*-# @Author: hebe# @Date: 2020-04-18 18:31:03# @Last Modified by: hebe# @Last Modified time: 2020-04-18 19:40:48import osimport globimport openpyxldef merge_xlsx_files(xlsx_files):wb = openpyxl.load_workbook(xlsx_files[0])ws = wb.activews.title = "merged result"for filename in xlsx_files[1:]:workbook = openpyxl.load_workbook(filename)sheet = workbook.activefor row in sheet.iter_rows(min_row=1):values = [cell.value for cell in row]ws.append(values)return wb#path is very important here , must true.def get_all_xlsx_files(path):xlsx_files = glob.glob(os.path.join(r'C:\\Users\\pdcfi\\Desktop\\', '*.xlsx'))sorted(xlsx_files, key=str.lower)return xlsx_filesdef main():xlsx_files = get_all_xlsx_files(os.path.expanduser('~lmx'))wb = merge_xlsx_files(xlsx_files)wb.save('merged_form.xlsx')if __name__ == '__main__':main()print("all excel append OK!")
來自好友劉早起的代碼:
# -*- coding: utf-8 -*-from openpyxl import load_workbook, Workbookimport globpath = "C:\\Users\\pdcfi\\Desktop\\excel\\"new_workbook = Workbook()new_sheet = new_workbook.active# 用flag變量明確新表是否已經(jīng)添加了表頭,只要添加過一次就無(wú)須重復(fù)再添加flag = 0for file in glob.glob(path + '/*.xlsx'):workbook = load_workbook(file)sheet = workbook.activecoloum_A = sheet['A']row_lst = []for cell in coloum_A:if cell:print(cell.row)row_lst.append(cell.row)if not flag:header = sheet[1]header_lst = []for cell in header:header_lst.append(cell.value)new_sheet.append(header_lst)flag = 1for row in row_lst:data_lst = []for cell in sheet[row]:data_lst.append(cell.value)new_sheet.append(data_lst)new_workbook.save(path + '/' + '符合篩選條件的新表.xlsx')
來自群友Engineer的代碼:
import tkinter as tkfrom tkinter import filedialogimport osimport pandas as pdimport globroot = tk.Tk()root.withdraw()# 選擇文件夾位置filelocation = os.path.normpath(filedialog.askdirectory(initialdir=os.getcwd()))lst = []# 讀取文件夾下所有文件(xls和xlsx都讀?。?/span>for i in glob.glob(filelocation + "\\\\" + "*.*"):if os.path.splitext(i)[1] in [".xls", ".xlsx"]:lst.append(pd.read_excel(i))# 保存合并后的excel文件writer = pd.ExcelWriter(filedialog.asksaveasfilename(title="保存", initialdir=filelocation, defaultextension="xlsx",filetypes=[("Excel 工作簿", "*.xlsx"),("Excel 97-2003 工作簿", "*.xls")]))pd.concat(lst).to_excel(writer, 'all', index=False)writer.save()print('\n%d個(gè)文件已經(jīng)合并成功!' % len(lst))
最后需要本文項(xiàng)目代碼的小伙伴,請(qǐng)?jiān)诠娞?hào)后臺(tái)回復(fù)“合并文件”關(guān)鍵字進(jìn)行獲取,如果在運(yùn)行過程中有遇到任何問題,請(qǐng)隨時(shí)留言或者加小編好友,小編看到會(huì)幫助大家解決bug噢!
當(dāng)然了,實(shí)現(xiàn)本文功能不僅僅限于上面提及的3種方式,使用pandas也是可以做到的,如果你還有其他方法,歡迎交個(gè)朋友一起學(xué)習(xí)交流。
小編最近建立了一個(gè)Python付費(fèi)學(xué)習(xí)交流群,只需要9.99元小紅包即可入群學(xué)習(xí)交流,大家的學(xué)習(xí)氛圍很好,有問必答,里邊“無(wú)絲竹亂耳,亦無(wú)案牘勞形”,純交流學(xué)習(xí)之用,感興趣的小伙伴可以加下方小編微信進(jìn)群學(xué)習(xí)交流噢!

------------------- End -------------------
往期精彩文章推薦:
手把手教你利用Python輕松拆分Excel為多個(gè)CSV文件
Python項(xiàng)目實(shí)戰(zhàn)——手把手教你使用Django框架實(shí)現(xiàn)支付寶付款
手把手教你用Python爬取百度搜索結(jié)果并保存

歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入Python學(xué)習(xí)群請(qǐng)?jiān)诤笈_(tái)回復(fù)【入群】
萬(wàn)水千山總是情,點(diǎn)個(gè)【在看】行不行
/今日留言主題/
隨便說一兩句吧~
