Python让Excel飞起来—批量处理工作薄和工作表

目录

案例01 批量新建并保存工作薄

举一反三 批量新建并关闭工作薄

案例02 批量打开一个文件夹下的所有工作薄

举一反三 列出文件夹下所有文件和子文件夹的名称

案例03 批量重命名一个工作薄中的所有工作表

 举一反三  批量重命名一个工作薄中的部分工作表

 案例04 批量重命名多个工作薄

举一反三 批量重命名多个工作薄中的同名工作表

 案例05 在多个工作部中批量增加新的工作表

举一反三 在多个工作簿中批量删除工作表

案例06 批量打印工作薄

举一反三 批量打印多个工作薄中的指定工作表

案例07 将一个工作薄的所有工作表批量复制到其他工作薄

举一反三  将某个工作表的数据批量复制到其他工作薄的指定工作表中

案例08  按条件将一个工作表拆分为多个工作薄

举一反三 按条件将一个工作表拆分为多个工作表

案例09 批量合并多个工作簿中的同名工作表

举一反三 将工作薄中名称有规律的工作表合并到一个工作表中

例01 批量新建并保存工作薄

import xlwings as xw
app=xw.App(visible=False,add_book=False)
for i in range(6):
    workbook=app.books.add() #新建工作薄
    workbook.save(f'C:\\Users\\Administrator\\Desktop\\22\\text{i}.xlsx')

#f的作用是格式化字符串~实现类似于format的方法(就是print里的format方法)
#print(f'My hovercraft is full of {animals}.')

举一反三 批量新建并关闭工作薄

import xlwings as xw
app=xw.App(visible=True,add_book=False)
for i in range(6):
    workbook=app.books.add() #新建工作薄
    workbook.save(f'C:\\Users\\Administrator\\Desktop\\22\\text{i}.xlsx')
    workbook.close()
app.quit()

案例02 批量打开一个文件夹下的所有工作薄

import xlwings as xw
import os
file_path='C:\\Users\\Administrator\\Desktop\\22' #给出文件所在的路径文件夹名称
file_list=os.listdir(file_path)  #列出路径下所有文件和文件夹的名称

app=xw.App(visible=True,add_book=False) #启动excel程序
for term in file_list:
    if os.path.splitext(term)[1]=='.xlsx':
        app.books.open(file_path+'\\'+term)

举一反三 列出文件夹下所有文件和子文件夹的名称

import os
file_path='C:\\Users\\Administrator\\Desktop\\22' #给出文件所在的路径文件夹名称
file_list=os.listdir(file_path)  #列出路径下所有文件和文件夹的名称
for team in file_list:
    print(team)

'''
text0.xlsx
text1.xlsx
text2.xlsx
text3.xlsx
text4.xlsx
text5.xlsx
'''

案例03 批量重命名一个工作薄中的所有工作表

《Python让Excel飞起来—批量处理工作薄和工作表》

《Python让Excel飞起来—批量处理工作薄和工作表》

import xlwings as xw
import os
app=xw.App(visible=False)
workbook=app.books.open(r'C:\Users\Administrator\Desktop\22\统计表.xlsx') #打开工作表
worksheets=workbook.sheets #获取工作薄中所有工作表
for i in range(len(worksheets)):
    worksheets[i].name=worksheets[i].name.replace('销售','') #重命名文件夹
workbook.save(r'C:\Users\Administrator\Desktop\22\统计表2.xlsx')  #重命名后另存
app.quit()    

 举一反三  批量重命名一个工作薄中的部分工作表

import xlwings as xw
import os
app=xw.App(visible=False)
workbook=app.books.open(r'C:\Users\Administrator\Desktop\22\统计表.xlsx') #打开工作表
worksheets=workbook.sheets #获取工作薄中所有工作表
for i in range(len(worksheets))[:5]:  #通过切片器来选中部分工作表
    worksheets[i].name=worksheets[i].name.replace('销售','') #重命名文件夹
workbook.save(r'C:\Users\Administrator\Desktop\22\统计表3.xlsx')  #重命名后另存
app.quit() 

 案例04 批量重命名多个工作薄

《Python让Excel飞起来—批量处理工作薄和工作表》《Python让Excel飞起来—批量处理工作薄和工作表》

import os
file_path=r'C:\Users\Administrator\Desktop\22\产品销售表' #给出文件所在的路径文件夹名称
file_list=os.listdir(file_path)  #列出路径下所有文件和文件夹的名称

old_book_name='销售表'  #给出工作薄中需要替换的旧关键字名
new_book_name='分部产品销售表'  #给出工作薄中需要替换的新关键字名

for i in file_list:
    if i.startswith('~$'):  #判断是否有~$开头的临时文件
        continue   #如果有,则跳过
    new_file=i.replace(old_book_name,new_book_name) #执行查找和替换,生成新的工作薄名
    old_file_path=os.path.join(file_path,i)  #构造需要重命名工作薄的完整路径
    new_file_path=os.path.join(file_path,new_file)  #构造需要重命名后工作薄的完整路径
    os.rename(old_file_path,new_file_path)   

os.path.join()是os模块中的函数,用于把文件夹名和文件名拼接成一个完整路径,该函数的语法格式和常用的函数定义如下:

《Python让Excel飞起来—批量处理工作薄和工作表》

举一反三 批量重命名多个工作薄中的同名工作表

将下面表中的所有sheet1工作表重命名员工信息表

《Python让Excel飞起来—批量处理工作薄和工作表》《Python让Excel飞起来—批量处理工作薄和工作表》 《Python让Excel飞起来—批量处理工作薄和工作表》

import os
import xlwings as xw
file_path=r'C:\Users\Administrator\Desktop\22\信息表' #给出文件所在的路径文件夹名称
file_list=os.listdir(file_path)  #列出路径下所有文件和文件夹的名称
old_sheet_name='Sheet1' #给出要修改的工作薄名
new_sheet_name='员工信息表' #给出要修改的工作薄名
app=xw.App(visible=False)
for i in file_list:
    if i.startswith('~$'):
        continue
    old_file_path=os.path.join(file_path,i)
    workbook=app.books.open(old_file_path)
    for j in workbook.sheets:
        if j.name==old_sheet_name:
            j.name=new_sheet_name
    workbook.save() #保存工作薄
app.quit()

 案例05 在多个工作部中批量增加新的工作表

import os
import xlwings as xw
file_path=r'C:\Users\Administrator\Desktop\22\信息表' #给出文件所在的路径文件夹名称
file_list=os.listdir(file_path)  #列出路径下所有文件和文件夹的名称
app=xw.App(visible=False)
sheet_name='产品销售区域'
for i in file_list:
    if i.startswith('~$'):
        continue
    old_file_path=os.path.join(file_path,i)
    workbook=app.books.open(old_file_path)
    sheet_names=[j.name for j in workbook.sheets]
    if sheet_name not in sheet_names:
        workbook.sheets.add(sheet_name)
        workbook.save() #保存工作薄
app.quit()

举一反三 在多个工作簿中批量删除工作表

import os
import xlwings as xw
file_path=r'C:\Users\Administrator\Desktop\22\信息表' #给出文件所在的路径文件夹名称
file_list=os.listdir(file_path)  #列出路径下所有文件和文件夹的名称
app=xw.App(visible=False)
sheet_name='产品销售区域'
for i in file_list:
    if i.startswith('~$'):
        continue
    old_file_path=os.path.join(file_path,i)
    workbook=app.books.open(old_file_path)
    for j in workbook.sheets:
        if j.name==sheet_name:
            j.delete
            break
    workbook.save() #保存工作薄
app.quit()  #退出程序

案例06 批量打印工作薄

打印函数PrintOut()

import os
import xlwings as xw
file_path=r'C:\Users\Administrator\Desktop\22\公司' #给出文件所在的路径文件夹名称
file_list=os.listdir(file_path)  #列出路径下所有文件和文件夹的名称
app=xw.App(visible=False)
for i in file_list:
    if i.startswith('~$'):
        continue
    file_paths=os.path.join(file_path,i)
    workbook=app.books.open(file_paths)
    workbook.api.PrintOut()
    workbook.close()
app.quit()

因为xlwings模块没有提供打印工作薄的函数,所以用api属性调用vba中的PrintOut()函数来打印工作薄。

PrintOut参数说明

参数说明
From可选参数,指定打印的开始页码,如果省略,表示从头开始打印
To可选参数,指定打印的结束页码,如果省略,表示打印到最后一页
Copies可选参数,指定打印份数,如果省略,则打印一份
Preview可选参数,如果为True,Excel打印前会进行预览,False则直接打印
ActivePrinter可选参数,设置打印机的名称,省略为默认打印机
PrintToFile可选参数,如果为True表示不打印到打印机,而打印为一个prn文件,如果没指定,Excel件提示用户输入文件名
Collate

可选参数,如果为True,则逐份打印多个副本

PrToFileName

可选参数,如果为True,则用该参数指定prn文件的文件名

举一反三 批量打印多个工作薄中的指定工作表

import os
import xlwings as xw
file_path=r'C:\Users\Administrator\Desktop\22\公司1' #给出文件所在的路径文件夹名称
file_list=os.listdir(file_path)  #列出路径下所有文件和文件夹的名称
app=xw.App(visible=False)
sheet_name='产品分类表'
for i in file_list:
    if i.startswith('~$'):
        continue
    file_paths=os.path.join(file_path,i)
    workbook=app.books.open(file_paths)
    for term in workbook.sheets:
        if term.name==sheet_name:
            term.api.PrintOut()
            break        
app.quit()

案例07 将一个工作薄的所有工作表批量复制到其他工作薄

import os
import xlwings as xw
file_path=r'C:\Users\Administrator\Desktop\22\销售表' #给出文件所在的路径文件夹名称
file_list=os.listdir(file_path)  #列出路径下所有文件和文件夹的名称
workbook=app.books.open(r'C:\Users\Administrator\Desktop\22\信息表.xlsx')  #打开要复制的表
worksheet=workbook.sheets  #获取源工作薄中的所有工作表
for i in file_list:
    if i.startswith('~$'):  #判断是否为'~$'的表,有则跳过
        continue
    if os.path.splitext(i)[1]=='.xlsx':  #判断是否是xlsx的文件
        workbooks=app.books.open(file_path+'\\'+i)   #如果是就将其打开
        worksheets=workbooks.sheets  #获取打开工作薄中的工作表
        for j in worksheet:  #遍历源工作薄中的所有工作表
            for m in worksheets:
                if m.name==j.name:
                    m.delete()   #判断表中是否有与源表要新增的表名称一样的表,有则删除
            contents=j.range('A1').expand('table').value  #获取源工作表中的数据内容
            name=j.name  #获取源工作表的名称
            workbooks.sheets.add(name=name,after=len(workbooks.sheets))  #新增工作表,命名和存放在最后一个表后面
            workbooks.sheets[name].range('A1').value=contents  #写入新增表的内容
        workbooks.save()
app.quit()

expand()是xlwings模块中的函数,用于扩展选择范围,expand(‘table’),默认值是table,表示向整个数据表扩展,也可以是‘down’或者‘right’,表示向表的下方或右方扩展。

举一反三  将某个工作表的数据批量复制到其他工作薄的指定工作表中

import os
import xlwings as xw
file_path=r'C:\Users\Administrator\Desktop\22\销售表1' #给出文件所在的路径文件夹名称
file_list=os.listdir(file_path)  #列出路径下所有文件和文件夹的名称
workbook=app.books.open(r'C:\Users\Administrator\Desktop\22\新增产品表.xlsx')  #打开要复制的表
worksheet=workbook.sheets['新增产品']   #选择复制源表中的新增产品这个表

#读取‘新增产品’表中的数据
value=worksheet.range('A1').expand('table')
start_cell=(2,1)  #给出要复制的单元格起点位置
end_cell=(value.shape[0],value.shape[1])  #要复制单元格的结束位置
cell_area=worksheet.range(start_cell,end_cell).value  #根据前面设定的起始单元格,构造出复制区域

for i in file_list:
    if os.path.splitext(i)[1]=='.xlsx':
        if i.startswith('~$'):  #判断是否为'~$'的表,有则跳过
            continue
        try:
            workbooks=xw.Book(file_path+'\\'+i)
            sheet=workbooks.sheets['产品分类表']
            scope=sheet.range('A1').expand('table')
            sheet.range(scope.shape[0]+1,1).value=cell_area
            workbooks.save()
        finally:
            workbooks.close()
workbook.close()
app.quit()

案例08  按条件将一个工作表拆分为多个工作薄

《Python让Excel飞起来—批量处理工作薄和工作表》

拆分成多个工作薄: 《Python让Excel飞起来—批量处理工作薄和工作表》

《Python让Excel飞起来—批量处理工作薄和工作表》 代码如下: 

import xlwings as xw

#准备数据
file_path=r'C:\Users\Administrator\Desktop\22\产品统计表.xlsx'
file_path2=r'C:\Users\Administrator\Desktop\22\拆分后'
sheet_name='统计表'
app=xw.App(visible=True,add_book=False) #启动Excel程序
workbook=app.books.open(file_path) #打开源工作薄
worksheet=workbook.sheets[sheet_name]  #选中要拆分的工作表
value=worksheet.range('A2').expand('table').value  #读取要选中的单元格数据源

#拆分数据
data=dict()  #创建一个字典
for i in range(len(value)):
    product_name=value[i][1]
    if product_name not in data:
        data[product_name]=[]
    data[product_name].append(value[i])  #得到的data是按产品名称分类的字典数据集

for key,value in data.items():
    new_workbook=xw.books.add()  #新建工作簿
    new_worksheet=new_workbook.sheets.add(key) #在新建工作薄中新增工作表,并以key命名
    new_worksheet['A1'].value=worksheet['A1:H1'].value  #设置表的标题,即第一行
    new_worksheet['A2'].value=value  #将value的值从A2单元格进行粘贴
    new_workbook.save(file_path2+"\\"+'{}.xlsx'.format(key))  #重命名并另存为
app.quit()

举一反三 按条件将一个工作表拆分为多个工作表

import xlwings as xw
import pandas as pd
#准备数据
file_path=r'C:\Users\Administrator\Desktop\22\产品统计表.xlsx'
file_path2=r'C:\Users\Administrator\Desktop\22\拆分后'
sheet_name='统计表'
app=xw.App(visible=True,add_book=False) #启动Excel程序
workbook=app.books.open(file_path) #打开源工作薄
worksheet=workbook.sheets[sheet_name]  #选中要拆分的工作表
value=worksheet.range('A1').options(pd.DataFrame,header=1,index=False,expand='table').value  #读取要选中的单元格数据源
data=value.groupby('产品名称')  #将数据按照‘产品名称’分组
for idx,group in data:
    new_worksheet=workbook.sheets.add(idx)  #在工作薄中新增工作表并命名为当前的产品名称
    new_worksheet['A1'].options(index=False).value=group  #将数据添加到新的工作表中
workbook.save()
workbook.close()
app.quit()

案例09 批量合并多个工作簿中的同名工作表

import os
import xlwings as xw
file_path=r'C:\Users\Administrator\Desktop\22\销售统计' #给出文件夹
file_list=os.listdir(file_path)  #给出文件夹下的所有文件目录
sheet_name='产品销售统计' #给出要合并的同名工作表的名称
app=xw.App(visible=False)
header=None  #定义变量,初始值为空对象,后续用于存放要合并的工作表中的列标题
all_data=[]  #创建一个空列表
for i in file_list:
    if i.startswith('~$'):
        continue    
    file_paths=os.path.join(file_path,i)
    workbook=app.books.open(file_paths) #打开要合并的工作表
    for j in workbook.sheets:
        if j.name==sheet_name:
            if header==None:
                header=j['A1:I1'].value
            values=j['A2'].expand('table').value
            all_data=all_data+values
new_workbook=xw.Book()
new_worksheet=new_workbook.sheets.add(sheet_name)
new_worksheet['A1'].value=header
new_worksheet['A2'].value=all_data
new_worksheet.autofit()#根据内容自动调整工作表的行高列宽

new_workbook.save(r'C:\Users\Administrator\Desktop\22\销售统计\\上半年销售统计表.xlsx')
app.quit()

举一反三 将工作薄中名称有规律的工作表合并到一个工作表中

import os
import xlwings as xw
app=xw.App(visible=False)
workbook=app.books.open(r'C:\Users\Administrator\Desktop\22\采购表2.xlsx')
sheet_names=[str(sheet)+'月'for sheet in range(1,7)]

new_sheet_name='上半年统计表'  #指定新工作表的名称
hearder=None
all_data=[]
#若原先有‘上半年统计表’即删除
for i in workbook.sheets:
    if new_sheet_name in i.name:
        i.delete


new_worksheet=workbook.sheets.add(new_sheet_name)
title_copyed=False
for j in workbook.sheets:
    if j.name in sheet_names:
        if title_copyed==False:
            j['A1'].api.EntireRow.Copy(Destination=new_worksheet['A1'].api)  #复制表头
            title_copyed=True
        row_num=new_worksheet['A1'].current_region.last_cell.row  #列出新增工作表含有数据区域的最后一行
        
        j['A1'].current_region.offset(1,0).api.Copy(Destination=new_worksheet['A{}'.format(row_num+1)].api)
        
new_worksheet.autofit()
workbook.save()
workbook.close()
app.quit()    

解释:

  • api为调用VBA内的函数
  • EntireRow:整行,EntireRow.Copy上文中为A1所在整行进行复制
  • row_num=new_worksheet[‘A1’].current_region.last_cell.row   为当前区域(current_region)的最后(last_cell)一行

数据下载:

链接:https://pan.baidu.com/s/1sMPOspQ7zTcd-GKm57UCLg 
提取码:8888 

    原文作者:Colorfully_lu
    原文地址: https://blog.csdn.net/Colorfully_lu/article/details/122327656
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞