一、什么是xlwings模块
1、xlwings是Python操作excel读写操作的第三方库
2、特色: xlwings支持对xls和xlsx文件的读写,相对于其他第三方库xlrd,xlwd,openpyxl等效率高,可扩展性强。可以和matplotlib以及pandas无缝连接,也可以调用Excel文件中VBA写好的程序,和让VBA调用用Python写的程序。
二、如何使用
1、安装:pip install xlwings
2、应用模式: 对象》工作簿》工作表》表格内容
可以简单的理解,建立一个对象,就是打开一个excel程序,一个excel应用可以管理多个工作薄,一个工作薄中可以由多张表,一个表中有多个单元格
3、基本操作
3.1创建工作簿表
#创建操作对象 app=xw.App(visible=True,add_book=False) #visible 是否打开文件,在Excel软件中显示 #add_book 是否创建新的工作簿,即Excel表(这个表是默认的,未命名状态)
#创建一个工作簿,即Excel表
wb=app.books.add() #创建一个sheet工作表 sht=wb.sheets['sheet1'] #给单元格创建一个值 sht.range('A1').value='我给了单元格A1一个值2' #保存Excel,保存创建的工作簿,如果文件存在,则会覆盖原文件 #给连续的行写入值,从A2开始按行写 sht.range('A2').value=[1,2,3,4,56,7] #sht.range('A2:F2').value=[1,2,3,4,56,7] #写入行,需要转置 sht.range('B2').options(transpose=True).value=[22,33,44,55] #插入行列 sht.range('A6').value=[[1,2],[3,4],[5,6]] #默认起点A6,插入三行两列 wb.save(r'file/xlwings_excel2.xlsx') #如果资源不关闭,任然还是可以对工作簿进行操作 #后写入的内容需要重新保存 # sht.range('A6').value='我给了单元格A1一个值5' #wb.save() #后面的保存不需要传入文件 #关闭Excel程序, # 如果不关闭资源,重复执行的话,则会生成一个默认的工作簿 wb.close() app.quit()
3.2读取工作簿
#创建操作对象 app=xw.App(visible=True,add_book=False) #打开已有的工作簿 wb=app.books.open(r'file/xlwings_excel2.xlsx') #打开sheet表,表不存在保存 sht=wb.sheets['sheet1'] #打印单元的值 a1=sht.range('A1').value print(a1) #读一行的值,A2:F2 a2=sht.range('A2:F2').value print(a2) #列表的形式显示 #读一列 b2=sht.range('b2:b20').value print(b2) #列表显示,如果没有值,显示none #读一个数组,如果对表有写的操作,需要保存wb.save() a6_b6=sht.range('a6:b8').value print(a6_b6) #一个二维数组
#关闭资源 wb.close() app.quit()
3.3一些数据读取的操作
import xlwings as xw import time #xlwings对表操作的性能测试 #建立一个操作对象 app=xw.App(visible=False,add_book=False) start_open_time=time.time() #打开一个工作薄 wb=app.books.open(r'file/test_企业微信群名单.xlsx') sht=wb.sheets[3] t1=time.time() print(f'打开工作薄所需要的时间{t1-start_open_time}') #1.82s ''' 结论: 打开工作薄所需要的时间与工作薄的数据大小有关,和工作表的大小无关 Member_20210901202429.xlsx 36w数据-18秒 test_企业微信群名单.xlsx 多个工作表:5万数据,1.8s ''' #读取工作表的数据 #按行加载读取 #得到表中有值的最大行和列 table_info = sht.used_range nrows = table_info.last_cell.row ncolumns = table_info.last_cell.column print(f'表的最大行==》{nrows},最大列==》{ncolumns}') b_values=[] #按行取值,循环加入列表中 # for i in range(2,nrows+1): # v=sht.range(f'B{i}').value # if not v: break # 值是空的,结束循环 # b_values.append(v) #一次性加载某一列值 b_values=sht.range(f'B2:B{nrows+1}').value print(len(b_values)) #54297 t2=time.time() print(f'按行取值所需要的时间{t2-t1}') ''' 结论: 按行取值54297行,需要16.9s 一次性加载54297行,需要0.18s 在操作excel中,不要频繁的调用excel的range对象取值 尽量一次性的把数据读取到Python的内存中 ''' #资源关闭 wb.close() app.quit()
注意:
xlwings可以在Excel文件打开的状态下操作,在数据读取或者写入的时候,尽量一次性的读和写,不要频繁的打开文件,不要频率的调用range对象操作。
纯数字类型的单元格会被读成浮点型格式数据,如果你想要的是字符串,你需要在Excel中,分列转成文本类型
当读取一行或者一列时候,得到的是一个一维数组,多行多列的时候是二维数组。