当前位置: 首页 > 科技观察

教你4种用Python批量合并多个Excel和多个Sheet的方法

时间:2023-03-18 18:14:41 科技观察

1.前言大家好,我是崔燕飞。前两天跟大家分享了Python自动化文章:手把手教你用Python轻松将Excel拆分成多个CSV文件,然后一位读者在Python进阶交流群遇到了一个问题。他有很多Excel表格。他需要合并这些Excel文件。诚然,打开再复制粘贴是可行的,但这种方法费时费力,而且也容易出错。也可以手动处理多个文件。如果有几十个甚至上百个,你就瞎了,但是这个问题是针对Python的。就这么简单,一起来看看吧!2、项目目标使用Python实现多个Excel、多个Sheet的合并处理。3、项目准备软件:PyCharm所需库:pandas、xlrd、os4、项目分析1)如何选择要合并的Excel文件?使用os获取所有要合并的Excel文件。2)如何选择要合并的Sheet?使用xlrd库读取Excel,获取待合并的Sheet名称。3)如何合并?使用pandas库将所有Sheet名称一一打开,使用concat()追加合并数据。4)如何保存文件?使用to_excel保存数据得到最终的合并目标文件。五、项目实现1、第一步导入需要的库importpandasaspdimportxlrdimportos2。第二步,选择要合并的Excel文件#合并文件路径path="D:/b/"#获取文件夹下的所有EXCEL名称xlsx_names=[xforxinos.listdir(path)ifx.endswith(".xlsx“)]3。第三步,选择要合并的Sheet#获取第一个EXCEL名称xlsx_names1=xlsx_names[0]aa=path+xlsx_names1#打开第一个EXCELfirst_file_fh=xlrd.open_workbook(aa)#获取SHEET名称first_file_sheet=first_file_fh.sheets()4.第四步循环合并Sheet内容#CyclebySHEETnameforsheet_nameinsheet_names:df=None#CyclebyEXCELnameforxlsx_nameinxlsx_names:sheet_na=pd.ExcelFile(path+xlsx_name).sheet_namesifsheet_nameinsheet_na:#print(sheet_name)_df=pd.read_excel(path+xlsx_name,sheet_name=sheet_name,header=None)ifdfisNone:df=_dfelse:df=pd.concat([df,_df],ignore_index=True)else:continue5.第五步,保存合并后的文件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+=1writer.save()writer.close()六、效果展示1.处理前的Excel数据:2.运行进度提示:3.合并结果:7.总结本文介绍如何用Python合并多个Excel文件和多个Sheet,减少了很多复制粘贴的麻烦,省时省力,不易出错,代码不多,循环追加有点绕圈子,想想就明白了,有不懂的随时留言提问,大家一起学习进步,有想法的朋友也可以把文中的代码打包做成一个exe可执行的小软件,打包后发给别人,还可以赚取一些小费哦,这里就不详细介绍打包教程了,欢迎收看:你必须记住的三个Pyinstaller打包命令——用Python来打包打包exe。8、下面两个彩蛋代码是群里的小伙伴们提供的。小编也亲测了下。亲测有效,欢迎大家积极尝试!来自群友Jayson的代码:#-*-coding:utf-8-*-#@Author:hebe#@Date:2020-04-1818:31:03#@LastModifiedby:hebe#@LastModifiedtime:2020-04-1819:40:48importosimportglobimportopenpyxldefmerge_xlsx_files(xlsx_files):wb=openpyxl.load_workbook(xlsx_files[0])ws=wb.activews.title="mergedresult"forfilenameinxlsx_files[1:]:workbook=openpyxl.load_workbook(filename)sheet=workbook。activeforrowinsheet.iter_rows(min_row=1):values=[cell.valueforcellinrow]ws。append(values)returnwb#pathisveryimportanthere,musttrue.defget_all_xlsx_files(path):xlsx_files=glob.glob(os.path.join(r'C:\\Users\\pdcfi\\Desktop\\','*.xlsx'))sorted(xlsx_files,key=str.lower)returnxlsx_filesdefmain():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("allexcelappendOK!")朋友刘早起的代码:#-*-coding:utf-8-*-fromopenpyxlimportload_workbook,Workbookimportglobpath="C:\\Users\\pdcfi\\Desktop\\excel\\"new_workbook=Workbook()new_sheet=new_workbook.active#使用flag变量明确表头是否已经添加到新表中,只要因为添加一次,所以不需要重复添加flag=0forfileinglob.glob(path+'/*.xlsx'):workbook=load_workbook(file)sheet=workbook.activecoloum_A=sheet['A']row_lst=[]forcellincoloum_A:ifcell:print(cell.row)row_lst.append(cell.row)ifnotflag:header=sheet[1]header_lst=[]forcellinheader:header_lst.append(cell.value)new_sheet.append(header_lst)flag=1forrowinrow_lst:data_lst=[]forcellinsheet[row]:data_lst.append(cell.value)new_sheet.append(data_lst)new_workbook.save(path+'/'+'满足过滤条件的newsheet.xlsx')来自群友工程师的代码:importtkinterastkfromtkinterimportfiledialogimportosimportpandasaspdimportglobroot=tk.Tk()root.withdraw()#选择文件夹位置filelocation=os.path.normpath(filedialog.askdirectory(initialdir=os.getcwd()))lst=[]#读取文件夹下所有文件(读取xls和xlsx)foriinglob。glob(filelocation+"\\\\"+"*.*"):ifos.path.splitext(i)[1]in[".xls",".xlsx"]:lst.append(pd.read_excel(i))#保存合并后的excel文件writer=pd.ExcelWriter(filedialog.asksaveasfilename(title="Save",initialdir=filelocation,defaultextension="xlsx",filetypes=[("Excelworkbook","*.xlsx"),("Excel97-2003工作簿","*.xls")]))pd.concat(lst).to_excel(writer,'all',index=False)writer.save()print('\n%d个文件已成功合并!'%len(lst))当然,本文功能的实现不限于上述三种方式,也可以使用pandas来完成。如果大家还有其他方法,欢迎交友一起学习!