十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
一、前言

大家好,我是崔艳飞。前两天给大家分享了Python自动化文章:手把手教你利用Python轻松拆分Excel为多个CSV文件,而后在Python进阶交流群里边有读者遇到一个问题,他有很多个Excel表格,他需要对这些Excel文件进行合并。
诚然,一个一个打开复制粘贴固然可行,但是该方法费时费力,还容易出错,几个文件还可以手动处理,要是几十个甚至上百个,你就抓瞎了,不过这问题对Python来说,so easy,一起来看看吧!
二、项目目标
用Python实现多Excel、多Sheet的合并处理。
三、项目准备
软件:PyCharm
需要的库:pandas, xlrd,os
四、项目分析
1)如何选择要合并的Excel文件?
利用os,获取所有要合并的Excel文件。
2)如何选择要合并的Sheet?
利用xlrd库进行Excel读取,获取要合并的Sheet名。
3)如何合并?
利用pandas库,对所有Sheet名逐一循环打开,通过concat()进行数据追加合并即可。
4)如何保存文件?
利用to_excel保存数据,得到最终合并后的目标文件。
五、项目实现
1、第一步导入需要的库
- 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内容进行循环合并
- #按SHEET名循环
 - for sheet_name in sheet_names:
 - df = None
 - # 按EXCEL名循环
 - 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数据:
2、运行进度提示:
3、合并后的结果:
七、总结
本文介绍了如何利用Python对多个Excel文件、多Sheet进行合并处理,减少了很多复制粘贴的麻烦,省时省力,还不容易出错,代码不多,循环追加有点绕,想想也就明白了,不懂的随时留言提问,大家一起学习进步。
有想法的小伙伴还可以将文章中的代码进行打包,做成一个exe可执行的小软件,包装好发给别人使用,也可以赚点小费噢,关于打包的教程这里不再赘述,欢迎前往:三个你必须要记住的Pyinstaller打包命令——利用Python实现打包exe。
八、彩蛋
下面两份代码是群内小伙伴提供了,小编也自行测试了下,亲测有效,欢迎大家积极尝试噢!
来自群友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变量明确新表是否已经添加了表头,只要添加过一次就无须重复再添加
 - 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都读取)
 - 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个文件已经合并成功!' % len(lst))
 
当然了,实现本文功能不仅仅限于上面提及的3种方式,使用pandas也是可以做到的,如果你还有其他方法,欢迎交个朋友一起学习交流!