编程改变生活:用Python提升你的能力(进阶篇·微课视频版)
上QQ阅读APP看书,第一时间看更新

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