手把手教你4種方法用Python批量實現(xiàn)多Excel多Sheet合并
一、前言
大家好,我是崔艷飛。前兩天給大家分享了Python自動化文章:手把手教你利用Python輕松拆分Excel為多個CSV文件,而后在Python進階交流群里邊有讀者遇到一個問題,他有很多個Excel表格,他需要對這些Excel文件進行合并。

誠然,一個一個打開復(fù)制粘貼固然可行,但是該方法費時費力,還容易出錯,幾個文件還可以手動處理,要是幾十個甚至上百個,你就抓瞎了,不過這問題對Python來說,so easy,一起來看看吧!
二、項目目標
用Python實現(xiàn)多Excel、多Sheet的合并處理。
三、項目準備
軟件:PyCharm
需要的庫:pandas, xlrd,os
四、項目分析
1)如何選擇要合并的Excel文件?
利用os,獲取所有要合并的Excel文件。
2)如何選擇要合并的Sheet?
利用xlrd庫進行Excel讀取,獲取要合并的Sheet名。
3)如何合并?
利用pandas庫,對所有Sheet名逐一循環(huán)打開,通過concat()進行數(shù)據(jù)追加合并即可。
4)如何保存文件?
利用to_excel保存數(shù)據(jù),得到最終合并后的目標文件。
五、項目實現(xiàn)
1、第一步導(dǎo)入需要的庫
- import pandas as pd
- import xlrd
- import os
2、第二步選擇要合并的Excel文件
- #要合并文件路徑
- path="D:/b/"
- #獲取文件夾下所有EXCEL名
- xlsx_names = [x for x in os.listdir(path) if x.endswith(".xlsx")]
3、第三步選擇要合并的Sheet
- # 獲取第一個EXCEL名
- xlsx_names1 = xlsx_names[0]
- aa = path + xlsx_names1
- #打開第一個EXCEL
- first_file_fh=xlrd.open_workbook(aa)
- # 獲取SHEET名
- first_file_sheet=first_file_fh.sheets()
4、第四步對Sheet內(nèi)容進行循環(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_names
- if 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 = _df
- else:
- 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個,第%d個。" % (len(sheet_names),num))
- num += 1
- writer.save()
- writer.close()
六、效果展示
1、處理前Excel數(shù)據(jù):

2、運行進度提示:

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

七、總結(jié)
本文介紹了如何利用Python對多個Excel文件、多Sheet進行合并處理,減少了很多復(fù)制粘貼的麻煩,省時省力,還不容易出錯,代碼不多,循環(huán)追加有點繞,想想也就明白了,不懂的隨時留言提問,大家一起學(xué)習(xí)進步。
有想法的小伙伴還可以將文章中的代碼進行打包,做成一個exe可執(zhí)行的小軟件,包裝好發(fā)給別人使用,也可以賺點小費噢,關(guān)于打包的教程這里不再贅述,歡迎前往:三個你必須要記住的Pyinstaller打包命令——利用Python實現(xiàn)打包exe。
八、彩蛋
下面兩份代碼是群內(nèi)小伙伴提供了,小編也自行測試了下,親測有效,歡迎大家積極嘗試噢!
來自群友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:48
- import os
- import glob
- import openpyxl
- def merge_xlsx_files(xlsx_files):
- wb = openpyxl.load_workbook(xlsx_files[0])
- ws = wb.active
- ws.title = "merged result"
- for filename in xlsx_files[1:]:
- workbook = openpyxl.load_workbook(filename)
- sheet = workbook.active
- for 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_files
- def 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, Workbook
- import glob
- path = "C:\\Users\\pdcfi\\Desktop\\excel\\"
- new_workbook = Workbook()
- new_sheet = new_workbook.active
- # 用flag變量明確新表是否已經(jīng)添加了表頭,只要添加過一次就無須重復(fù)再添加
- flag = 0
- for file in glob.glob(path + '/*.xlsx'):
- workbook = load_workbook(file)
- sheet = workbook.active
- coloum_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 = 1
- for 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 tk
- from tkinter import filedialog
- import os
- import pandas as pd
- import glob
- root = tk.Tk()
- root.withdraw()
- # 選擇文件夾位置
- filelocation = os.path.normpath(filedialog.askdirectory(initialdir=os.getcwd()))
- lst = []
- # 讀取文件夾下所有文件(xls和xlsx都讀?。?nbsp;
- 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個文件已經(jīng)合并成功!' % len(lst))
當然了,實現(xiàn)本文功能不僅僅限于上面提及的3種方式,使用pandas也是可以做到的,如果你還有其他方法,歡迎交個朋友一起學(xué)習(xí)交流!
