1.5 典型应用
本节讲述使用Python批量处理Excel文档的典型应用,包括批量替换Excel工作簿中的数据、将多个工作表合并为一个工作表、批量拆分列数据。
1.5.1 批量替换Excel工作簿中的单元格数据
【实例1-23】 在D盘test文件夹下的demo3文件夹下有5个Excel文档,这5个工作簿中都存储了“电冰箱”的数据,如图1-45和图1-46所示。
图1-45 文件夹demo3下的Excel文档
图1-46 4月销售数据.xlsx文件中的工作表
将该文件夹下Excel工作簿中的“电冰箱”替换为“三门电冰箱”,并保存数据,代码如下:
#===第1章代码1-23.py===# import xlwings as xw from pathlib import Path src_folder=Path('D:\\test\\demo3\\') file_list=list(src_folder.glob('*.xlsx')) app=xw.App(visible=False,add_book=False) for file in file_list: if file.name.startswith('~$'): continue#Excel在打开一个工作簿的同时会生成一个以'~$'为开头的临时文件,要 #跳过此类文件 book=app.books.open(file) for sheet in book.sheets: data=sheet['a2'].expand('table').value for index,val in enumerate(data): print(val) if val[2]=='电冰箱': val[2]='三门电冰箱' data[index]=val sheet['a2'].expand('table').value=data book.save() book.close() app.quit()
运行结果如图1-47和图1-48所示。
图1-47 代码1-23.py的运行结果
图1-48 替换关键词后的Excel工作簿
1.5.2 将多个工作表合并为一个工作表
【实例1-24】 在D盘test文件夹下的demo4文件夹下有4个Excel文档,这4个工作簿中都含有名字是Sheet1的工作表,如图1-49和图1-50所示。
图1-49 文件夹demo4下的Excel文档
图1-50 Excel文档中的工作表Sheet1
将该文件夹下Excel文档中的名字是Sheet1的工作表合并为一个工作表,并保存在该目录下,代码如下:
#===第1章代码1-24.py===# import xlwings as xw from pathlib import Path src_folder=Path('D:\\test\\demo4\\') file_list=list(src_folder.glob('*.xlsx')) app=xw.App(visible=False,add_book=False) #数据的读取和合并 header=None all_data=[] for file in file_list: if file.name.startswith('~$'): continue book=app.books.open(file) for sheet in book.sheets: if sheet.name=='Sheet1': if header==None: header=sheet['a1:f1'].value data=sheet['a2'].expand('table').value all_data=all_data+data book.close() #创建一个新的工作簿来存储数据 new_book=xw.Book() new_sheet=new_book.sheets.add('四个月的销售数据') new_sheet['a1'].value=header new_sheet['a2'].value=all_data new_sheet.autofit() new_book.save('D:\\test\\demo4\\合并的销售数据.xlsx') new_book.close() app.quit()
运行结果如图1-51和图1-52所示。
图1-51 代码1-24.py创建的Excel文档
图1-52 代码1-24.py合并的工作表
1.5.3 批量拆分列数据
【实例1-25】 在D盘test文件夹下的demo5文件夹下有5个Excel文档,这5个工作簿中都含有名字是Sheet1的工作表,如图1-53和图1-54所示。
图1-53 文件夹demo5下的Excel文档
图1-54 Excel文档中的工作表Sheet1
将该文件夹下Excel文档中工作表的“产品尺寸(mm)”列批量分拆成三列(长、宽、高),并保存数据,代码如下:
#===第1章代码1-25.py===# import xlwings as xw import pandas as pd from pathlib import Path src_folder=Path('D:\\test\\demo5\\') file_list=list(src_folder.glob('*.xlsx')) app=xw.App(visible=False,add_book=False) for file in file_list: if file.name.startswith('~$'): continue book=app.books.open(file) sheet=book.sheets['Sheet1'] data=sheet.range('a1').options(pd.DataFrame,header=1,index=False, expand='table').value new_data=data['产品尺寸(mm)'].str.split('*',expand=True) new_data.columns=['长(mm)','宽(mm)','高(mm)'] for n in range(new_data.shape[1]-1): sheet['E:E'].insert(shift='right', copy_origin='format_from_left_or_above') sheet['E1'].options(index=False).value=new_data sheet.autofit() book.save() app.quit
运行结果如图1-55所示。
图1-55 分拆后的工作表Sheet1