小言_互联网的博客

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

337人阅读  评论(0)

点击上方“Python爬虫与数据挖掘”,进行关注

回复“书籍”即可获赠Python从入门到进阶共10本电子书

不堪玄鬓影,来对白头吟。

一、前言

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


   
  1. import pandas as pd
  2. import xlrd
  3. import os

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


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

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


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

来自好友刘早起的代码:


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

来自群友Engineer的代码:


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

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

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

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

------------------- End -------------------

往期精彩文章推荐:

欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

想加入Python学习群请在后台回复【入群

万水千山总是情,点个【在看】行不行

/今日留言主题/

随便说一两句吧~


转载:https://blog.csdn.net/pdcfighting/article/details/114267225
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场