xlwings 模块基本操作

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

基本概念

安装

pip install xlwings

应用模式:
对象(Apps) -> 工作簿(Books) -> 工作表(Sheets) -> 表格内容(Range)
可以简单的理解,建立一个对象,就是打开一个excel程序,一个excel应用可以管理多个工作薄,一个工作薄中可以由多张表,一个表中有多个单元格

基本操作

1. 创建工作簿表

import xlwings as xw

# 创建操作对象
# visible  是否打开文件,在Excel软件中显示
# add_book 是否创建新的工作簿,即Excel表(这个表是默认的,未命名状态)
app = xw.App(visible=True, add_book=False)

app.display_alerts = False # 关闭提示信息
app.screen_updating = False # 关闭显示更新

#创建一个工作簿,即Excel表
wb=app.books.add()

#创建一个sheet工作表
sht=wb.sheets['sheet1']

#给单元格创建一个值
sht.range('A1').value='我给了单元格A1一个值2'

# 给连续的行写入值,从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('B2').options(transpose=True).value = sheet2.range('B2:B55').value

# 插入行列
sht.range('A6').value=[[1,2],[3,4],[5,6]] #默认起点A6,插入三行两列
# 多行多列
sht.range("A4").value = sheet2.range("E4:I22").value

# 批量插入行,原先的第 4 行下移到新插入的行后面,变成第 25 行
sh.api.Rows("4:24").Insert()

#获取表格最大行列
cell = ws1.used_range.last_cell
rows = cell.row
columns = cell.column
print(rows)
print(columns)

#保存Excel,保存创建的工作簿,如果文件存在,则会覆盖原文件
wb.save(r'file/xlwings_excel2.xlsx')

#如果资源不关闭,任然还是可以对工作簿进行操作
#后写入的内容需要重新保存
# sht.range('A6').value='我给了单元格A1一个值5'
#wb.save()  #后面的保存不需要传入文件

#关闭Excel程序,
# 如果不关闭资源,重复执行的话,则会生成一个默认的工作簿
wb.close()
app.quit()

2.读取工作簿

import xlwings as xw

#创建操作对象
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. 一些数据读取的操作

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中,分列转成文本类型

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

posted @ 2024-01-09 15:55  汉学  阅读(285)  评论(0)    收藏  举报