是这样的,这两年经常会收到这样几个需求(以钟经理为主),关于Excel的,经常需要把一个表格按照某个条件,比如省份,拆分成不同的sheet,有的时候呢还需要把每个sheet单独保存成一个表格。还有的时候又需要把一个文件夹里面很多个相同格式的表格合并成一个表格。这几个需求呢我也是经常用到,几乎每天都会用到,都是用VBA写好了的,直接执行就行了还是很方便,之前的某几篇有放过VBA的代码,可以拿去直接用。但是呢,在Excel里面用宏来操作还是不够智能,特别是要大批量或者自动化处理表格的时候,你们目前还没有遇到,但可能后面有机会遇到,那时候就很迷茫了。下面就把这几种问题分别用Python解答一下,主要有这么5个场景↓
一个workbook多个sheet,合并成一个sheet;
文件夹下多个单一workbook,合并成一个sheet;
文件夹下多个workbook下多个sheet,合并成一个sheet;
一个sheet按某一列拆分成多个sheet保存在一个workbook里;
一个sheet按某一列拆分成多个sheet分别保存为单个workbook;
下面就按顺序一个一个来↓
一个workbook多个sheet,合并成一个sheet
如上图效果,每个省份是一张sheet,都在一个workbook里面,需要把多个省份合并成一个sheet,如下↓
前半部分是简单的读取数据,主要是通过xlrd读取每个sheet的名字,然后用pandas读取每个表格,然后把表格链接在一起。到这里合并工作其实已经完成了,后半部分的工作主要是用xlsxwriter进行格式调整,这个可以根据表格字段需求自定义调整,可以参考之前的两篇Excel的自动化处理,很详细,链接在这里:
Python_Excel_01
Python_Excel_02_单元格格式
import osos.chdir(r"E:\Python\Excel\合并拆分\一个workbook多个sheet")import xlrdimport pandas as pdexcel_name = r"一个wb多个sht.xlsx"wb = xlrd.open_workbook(excel_name)sheets = wb.sheet_names()alldata = pd.DataFrame()for i in range(len(sheets)): df = pd.read_excel(excel_name, sheet_name=i) alldata = alldata.append(df)writer = pd.ExcelWriter('合并完成了.xlsx', engine='xlsxwriter')alldata.to_excel(writer, sheet_name='完成合并sheet', index=False)workbook = writer.bookworksheet = writer.sheets['完成合并sheet']#格式设置cell_format = workbook.add_format()cell_format.set_align('center') #居中worksheet.set_column('A:C', 10, cell_format)worksheet.set_column('D:D', 20, cell_format)writer.save()
文件夹下多个单一workbook,合并成一个sheet
如下图,在一个文件夹里面,有多个表格,每个表格里面是一个省份的数据,数据格式都是一样的,需要合并成一个sheet。
操作还是很简单,通过os模块读取文件夹下面的workbook,再循环遍历读取就行,然后通过pandas进行合并,最后是xlsxwriter格式美化。
import osos.chdir(r"E:\Python\Excel\合并拆分\多个workbook")import xlrdimport pandas as pdpwd = r"E:\Python\Excel\合并拆分\多个workbook"df_list = []for path,dirs,files in os.walk(pwd): for file in files: file_path = os.path.join(path,file) df = pd.read_excel(file_path) df_list.append(df)end = pd.concat(df_list)writer = pd.ExcelWriter('合并完成了.xlsx', engine='xlsxwriter')end.to_excel(writer, sheet_name='完成合并sheet', index=False)workbook = writer.bookworksheet = writer.sheets['完成合并sheet']#格式设置cell_format = workbook.add_format()cell_format.set_align('center') #居中worksheet.set_column('A:C', 10, cell_format)worksheet.set_column('D:D', 20, cell_format)writer.save()
文件夹下多个workbook下多个sheet,合并成一个sheet
这个就比刚刚上面那个稍微复杂一点了,因为不仅有多个workbook,而且每个workbook里面的sheet数量是不一样的。这就需要多一步循环操作,再遍历一遍每个workbook里面的sheet,然后进行拼接。其他方法都是一样的,效果如下↓
import osos.chdir(r"E:\Python\Excel\合并拆分\多个workbook下多个sheet")import xlrdimport pandas as pdpwd = r"E:\Python\Excel\合并拆分\多个workbook下多个sheet"df_list = []alldata = pd.DataFrame()for path,dirs,files in os.walk(pwd): for file in files: print(file) wb = xlrd.open_workbook(file) sheets = wb.sheet_names() for i in range(len(sheets)): df = pd.read_excel(file, sheet_name=i) alldata = alldata.append(df)writer = pd.ExcelWriter('合并完成了.xlsx', engine='xlsxwriter')alldata.to_excel(writer, sheet_name='完成合并sheet', index=False)workbook = writer.bookworksheet = writer.sheets['完成合并sheet']#格式设置cell_format = workbook.add_format()cell_format.set_align('center') #居中worksheet.set_column('A:D', 10, cell_format)worksheet.set_column('E:E', 20, cell_format)writer.save()
后面两个就是拆分了,差别在于一个是保存一个workbook里面,一个是单独保存。
一个sheet按某一列拆分成多个sheet保存在一个workbook里
如下表哪张有颜色的图,按照不同省份拆分成不同sheet,保存在一个workbook里面。
思路是这样的,先通过set把省份列去重,然后保存成列表,在进行循环,每次循环取一个省份的数据,然后新增一个sheet保存数据就行了。
import osos.chdir(r"E:\Python\Excel\合并拆分\workbook拆分")import pandas as pddata=pd.read_excel("待拆分文件.xlsx")area_list=list(set(data['省份']))writer=pd.ExcelWriter(r"拆分完成了.xlsx",engine='xlsxwriter')#data.to_excel(writer,sheet_name="总表",index=False)for j in area_list: df=data[data['省份']==j] df.to_excel(writer,sheet_name=j,index=False) workbook = writer.book worksheet = writer.sheets[j] cell_format = workbook.add_format() cell_format.set_align('center') #居中 worksheet.set_column('A:C', 10, cell_format) worksheet.set_column('D:D', 20, cell_format)writer.save()
一个sheet按某一列拆分成多个sheet分别保存为单个workbook
这个和上面差不多,不多是保存了单独的表格。代码逻辑也基本差不多,很容易理解。
import osos.chdir(r"E:\Python\Excel\合并拆分\workbook拆分")import pandas as pddata=pd.read_excel("待拆分文件.xlsx")area_list=list(set(data['省份']))for j in area_list: writer=pd.ExcelWriter(f"{j}.xlsx",engine='xlsxwriter') df=data[data['省份']==j] df.to_excel(writer,sheet_name=j,index=False) workbook = writer.book worksheet = writer.sheets[j] cell_format = workbook.add_format() cell_format.set_align('center') #居中 worksheet.set_column('A:C', 10, cell_format) worksheet.set_column('D:D', 20, cell_format) writer.save()
好了,没了,基本上应该够用了,等有时间封装成一个exe文件,就可以直接拿来用了~
End
◆ 统计_集中和离散趋势 ◆ Python拼音 ◆ Excel时间序列预测函数