手把手教你4种方法用Python批量实现多Excel多Sheet合并

一、前言

大家好,我是崔艳飞。前两天给大家分享了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、第一步导入需要的库

1import pandas as pd 2import xlrd 3import os

2、第二步选择要合并的Excel文件

1#要合并文件路径 2 path="D:/b/" 3 #获取文件夹下所有EXCEL4 xlsx_names = [x for x in os.listdir(path) if x.endswith(".xlsx")]

3、第三步选择要合并的Sheet

1 # 获取第一个EXCEL2 xlsx_names1 = xlsx_names[0] 3 4 aa = path + xlsx_names1 5 #打开第一个EXCEL 6 first_file_fh=xlrd.open_workbook(aa) 7 # 获取SHEET8 first_file_sheet=first_file_fh.sheets()

4、第四步对Sheet内容进行循环合并

1#按SHEET名循环 2 for sheet_name in sheet_names: 3 df = None 4 # 按EXCEL名循环 5 for xlsx_name in xlsx_names: 6 sheet_na = pd.ExcelFile(path + xlsx_name).sheet_names 7 if sheet_name in sheet_na: 8 #print(sheet_name) 9 _df = pd.read_excel(path + xlsx_name, sheet_name=sheet_name,header=None) 10 if df is None: 11 df = _df 12 else: 13 df = pd.concat([df, _df], ignore_index=True) 14 else:continue

5、第五步保存合并后的文件

1 df.to_excel(excel_writer=writer, sheet_name=sheet_name, encoding="utf-8", index=False) 2 print(sheet_name + " 保存成功!共%d个,第%d个。" % (len(sheet_names),num)) 3 num += 1 4 writer.save() 5 writer.close()

六、效果展示


1、处理前Excel数据:

2、运行进度提示:

3、合并后的结果:

七、总结

本文介绍了如何利用Python对多个Excel文件、多Sheet进行合并处理,减少了很多复制粘贴的麻烦,省时省力,还不容易出错,代码不多,循环追加有点绕,想想也就明白了,不懂的随时留言提问,大家一起学习进步。

有想法的小伙伴还可以将文章中的代码进行打包,做成一个exe可执行的小软件,包装好发给别人使用,也可以赚点小费噢,关于打包的教程这里不再赘述,欢迎前往:三个你必须要记住的Pyinstaller打包命令——利用Python实现打包exe

八、彩蛋

下面两份代码是群内小伙伴提供了,小编也自行测试了下,亲测有效,欢迎大家积极尝试噢!

来自群友Jayson的代码:

1 2# -*- coding: utf-8 -*- 3# @Author: hebe 4# @Date: 2020-04-18 18:31:03 5# @Last Modified by: hebe 6# @Last Modified time: 2020-04-18 19:40:48 7import os 8import glob 9import openpyxl 10 11def merge_xlsx_files(xlsx_files): 12 wb = openpyxl.load_workbook(xlsx_files[0]) 13 ws = wb.active 14 ws.title = "merged result" 15 16 for filename in xlsx_files[1:]: 17 workbook = openpyxl.load_workbook(filename) 18 sheet = workbook.active 19 for row in sheet.iter_rows(min_row=1): 20 values = [cell.value for cell in row] 21 ws.append(values) 22 return wb 23 24#path is very important here , must true. 25def get_all_xlsx_files(path): 26 xlsx_files = glob.glob(os.path.join(r'C:\\Users\\pdcfi\\Desktop\\', '*.xlsx')) 27 sorted(xlsx_files, key=str.lower) 28 return xlsx_files 29 30def main(): 31 xlsx_files = get_all_xlsx_files(os.path.expanduser('~lmx')) 32 wb = merge_xlsx_files(xlsx_files) 33 wb.save('merged_form.xlsx') 34 35if __name__ == '__main__': 36 main() 37 38print("all excel append OK!")

来自好友刘早起的代码:

1 2# -*- coding: utf-8 -*- 3from openpyxl import load_workbook, Workbook 4import glob 5 6path = "C:\\Users\\pdcfi\\Desktop\\excel\\" 7new_workbook = Workbook() 8new_sheet = new_workbook.active 9 10# 用flag变量明确新表是否已经添加了表头,只要添加过一次就无须重复再添加 11flag = 0 12 13for file in glob.glob(path + '/*.xlsx'): 14 workbook = load_workbook(file) 15 sheet = workbook.active 16 17 coloum_A = sheet['A'] 18 row_lst = [] 19 for cell in coloum_A: 20 if cell: 21 print(cell.row) 22 row_lst.append(cell.row) 23 24 if not flag: 25 header = sheet[1] 26 header_lst = [] 27 for cell in header: 28 header_lst.append(cell.value) 29 new_sheet.append(header_lst) 30 flag = 1 31 32 for row in row_lst: 33 data_lst = [] 34 for cell in sheet[row]: 35 data_lst.append(cell.value) 36 new_sheet.append(data_lst) 37 38new_workbook.save(path + '/' + '符合筛选条件的新表.xlsx')

来自群友Engineer的代码:

1 2import tkinter as tk 3from tkinter import filedialog 4import os 5import pandas as pd 6import glob 7 8root = tk.Tk() 9root.withdraw() 10 11# 选择文件夹位置 12filelocation = os.path.normpath(filedialog.askdirectory(initialdir=os.getcwd())) 13lst = [] 14 15# 读取文件夹下所有文件(xls和xlsx都读取) 16for i in glob.glob(filelocation + "\\\\" + "*.*"): 17 if os.path.splitext(i)[1] in [".xls", ".xlsx"]: 18 lst.append(pd.read_excel(i)) 19 20# 保存合并后的excel文件 21writer = pd.ExcelWriter(filedialog.asksaveasfilename(title="保存", initialdir=filelocation, defaultextension="xlsx", 22 filetypes=[("Excel 工作簿", "*.xlsx"), 23 ("Excel 97-2003 工作簿", "*.xls")])) 24pd.concat(lst).to_excel(writer, 'all', index=False) 25writer.save() 26 27print('\n%d个文件已经合并成功!' % len(lst))

最后需要本文项目代码的小伙伴,请在公众号后台回复“合并文件”关键字进行获取,如果在运行过程中有遇到任何问题,请随时留言或者加小编好友,小编看到会帮助大家解决bug噢!

当然了,实现本文功能不仅仅限于上面提及的3种方式,使用pandas也是可以做到的,如果你还有其他方法,欢迎交个朋友一起学习交流。

小编最近建立了一个Python付费学习交流群,只需要9.99元小红包即可入群学习交流,大家的学习氛围很好,有问必答,里边“无丝竹乱耳,亦无案牍劳形”,纯交流学习之用,感兴趣的小伙伴可以加下方小编微信进群学习交流噢!

-------------------********************************** End **********-------------**-----********-**********************************

往期精彩文章推荐:

欢迎各位大佬点击链接加入群聊【helloworld开发者社区】:https://jq.qq.com/?_wv=1027&k=mBlk6nzX进群交流IT技术热点。

本文转自 https://mp.weixin.qq.com/s/lxj2a1meuZ6mxlC8GKEGWg,如有侵权,请联系删除。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

​一篇文章总结一下Python库中关于时间的常见操作

前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在

Python3:sqlalchemy对mysql数据库操作,非sql语句

Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''

盘点CSV文件在Excel中打开后乱码问题的两种处理方法

大家好,我是Python进阶者。前几天给大家分享了一些乱码问题的文章,阅读量还不错,感兴趣的小伙伴可以前往:,,今天基于粉丝提问,给大家介绍CSV文件在Excel中打开后乱码问题的两种处理方法,希望对大家的学习有所帮助。前言前几天有个叫【RSL】的粉丝在Python交流群里问了一道关于CSV文件在Excel中打开后乱码的问题,如下图所示。在Excel中直接