目录
举一反三 将某个工作表的数据批量复制到其他工作薄的指定工作表中
例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 批量重命名一个工作薄中的所有工作表
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 批量重命名多个工作薄
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模块中的函数,用于把文件夹名和文件名拼接成一个完整路径,该函数的语法格式和常用的函数定义如下:
举一反三 批量重命名多个工作薄中的同名工作表
将下面表中的所有sheet1工作表重命名员工信息表
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 按条件将一个工作表拆分为多个工作薄
拆分成多个工作薄:
代码如下:
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