Python模块之xlwings

一、什么是xlwings模块

1、xlwings是Python操作excel读写操作的第三方库

2、特色: xlwings支持对xls和xlsx文件的读写,相对于其他第三方库xlrd,xlwd,openpyxl等效率高,可扩展性强。可以和matplotlib以及pandas无缝连接,也可以调用Excel文件中VBA写好的程序,和让VBA调用用Python写的程序。

 

二、如何使用

1、安装:pip install xlwings

2、应用模式: 对象》工作簿》工作表》表格内容

Python模块之xlwings

可以简单的理解,建立一个对象,就是打开一个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中,分列转成文本类型

当读取一行或者一列时候,得到的是一个一维数组,多行多列的时候是二维数组。
 

 

上一篇:IDEA-文件头部模板的设置


下一篇:JAVA 中的单元测试(IDEA)