python xlwings 用法教程
目录
打开excel App
工作簿
创建工作簿
xw.Book()
xw.books.add()
app.books.add()
编辑 使用工作簿
根据工作簿的名字/索引/序号
根据路径使用工作簿
操作工作簿
工作表
创建工作表
使用工作表
操作工作表
删除工作表
读写单元格
选择单元格
写数据到单元格
读取单元格数据
编辑
设置单元格样式
设置边框
删除单元格
import xlwings as xw # as后是别名,方便后续调用
在 xlwings 中
明确几个概念:
- 新建:创建一个不存在的工作薄或者工作表
- 打开:打开一个已经存在的工作薄
- 引用:就是告诉程序,你要操作哪个对象。比如你打开了A、B、C三个工作薄,现在你想操作B工作薄,就要先引用B
- 激活:我们可以同时打开多个工作薄,但是一次只能操作一个工作簿,我们正在操作的这个工作薄称为当前活动工作薄,激活的意思就是将某一个对象(工作薄或工作表等)变成当前活动对象
一个示例
关闭工作薄也很简单,就是使用wb.close(),注意:wb.close()只是关闭并不会保存,所以在关闭之前必须要使用save()进行一下保存才可以。可以考虑使用with搭建上下文,实现关闭资源。
打开excel App
使用 App() 打开Excel程序,一个App对应一个Excel实例。
为了防止僵尸进程,建议这样「启动」Excel( with 搭建上下文,会「自动释放」资源,无需手动close)
import xlwings as xw
with xw.App(visible=True) as app:
print(app) # <App [excel] 5276>
提示:
import xlwings as xw
with xw.App(visible=True) as app:
app.activate(True)
# 预期:Excel显示在桌面最前方(一闪而过)。
xw.app(visible=True, add_book=False)。默认都是True
其中可以设置参数visible:用来设置程序是否可见,True表示可见(默认),Flase不可见。add_book用来设置是否自动创建工作簿,True表示自动创建(默认),False不创建。当设置成add_book=False时,可以创建App,但是还未生成PID,只有当这个App创建了工作簿后,才会生成自己的PID
app.display_alerts = False # 在使用Excel的过程中,经常会遇到一些提醒信息,比如关闭前的保存提示、数据有效性的警告窗口,可以隐藏这些窗口,关闭一些提示信息,这样加快运行速度。默认为 True。
app.screen_updating = True # 更新显示工作表的内容,可以看到xlwings对Excel进行操作的过程,默认为 True。关闭它也可以提升运行速度。脚本运行完毕之后,记住把screen_updating属性值改回 True
工作簿
创建工作簿
有三种方式
xw.Book() 如果没有app,会创建一个app,同时创建一个工作簿。如果有app,就只在活动的app中,创建工作簿。
xw.books.add() 没有app,直接用这个创建工作簿会出错
app.books.add()
books = xw.books 当前活动App的工作簿集合
books = app.books 指定App的所有工作簿的集合
xw.Book()
如果没有app,会创建一个app,同时创建一个工作簿。如果有app,就只在活动的app中,创建工作簿
import xlwings as xw
for i in range(1,3):
wookbook = xw.Book() #创建新的App并在创建的App新建Book
print(wookbook)
print(xw.books) #Books([<Book [工作簿1]>, <Book [工作簿2]>]) #当前打开的所有Book对象的集合
print(xw.apps) # Apps([<App [excel] 105184>])
print(xw.apps.keys()) # [105184]
print(xw.apps.count) # 1
# 只会创建一个app,因为i=1时,没有app,所以会创建一个app,
# i=2时,已经有app了,只会在当前app下创建工作簿,而不会在创建新的app
xw.books.add()
没有execel程序时(),直接执行会报错
app.books.add()
import xlwings as xw
app = xw.App()
print('自带一个工作簿:', app.books[0]) # 自带一个工作簿: <Book [工作簿1]>
book = app.books.add()
print(book) # <Book [工作簿2]>
print(app.books)# Books([<Book [工作簿1]>, <Book [工作簿2]>])
总结:
import xlwings as xw
app1 = xw.App() # 创建一个APP程序并自带一个工作簿
app2 = xw.App() # 创建一个APP程序并自带一个工作簿
print(xw.apps) # Apps([<App [excel] 117068>, <App [excel] 23720>])
print(xw.apps.keys()) # [117068, 23720]
print(xw.apps.count) # 2
print(xw.books) # 当前App下打开的所有工作簿,Books([<Book [工作簿2]>])
print(app1.books.count) # 1
print(app2.books.count) # 1
print(xw.apps.active) # <App [excel] 117068>
wookbook = xw.books.add() # 在当前app下,新增一个工作簿
print(xw.apps) # Apps([<App [excel] 117068>, <App [excel] 23720>])
print(xw.apps.keys()) # [117068, 23720]
print(xw.apps.count) # 2
print(xw.books) # Books([<Book [工作簿2]>, <Book [工作簿3]>])
print(app1.books.count) # 1
print(app2.books.count) # 2
print(xw.apps.active) # <App [excel] 117068>
wookbook2 = xw.Book() # 在当前app下,新增一个工作簿,如果没有APP,就会创建,有了就只是在当前活动的app中新建一个工作簿
print(xw.apps) # Apps([<App [excel] 117068>, <App [excel] 23720>])
print(xw.apps.keys()) # [117068, 23720]
print(xw.apps.count) # 2
print(xw.books) # Books([<Book [工作簿2]>, <Book [工作簿3]>, <Book [工作簿4]>])
print(app1.books.count) # 1
print(app2.books.count) # 3
print(xw.apps.active)# <App [excel] 117068>
使用工作簿
根据工作簿的名字/索引/序号
「使用」指定的工作簿,根据工作簿的名字/索引/序号,并返回工作簿对象,有五种方式。
注意:() 根据 序号 选择,从1开始;[]根据 索引 选择,从0开始。
根据路径使用工作簿
根据「文件路径」(用r字符串包裹路径),有三种方式
路径
) 如果工作簿没有被打开,则会打开一个工作簿。如果打开了,就是引用工作簿。引用工作簿时,在所有的app实例中查找指定的工作簿,如果同一个工作簿在多个app实例中存在,就会返回一个错误信息路径
)路径
) 如果工作簿没打开就打开,打开就引用直接xw.books.open会报错
import xlwings as xw
xw.Book(r".\实例.xlsx") # 打开一个app,并打开当前目录下的实例工作簿
xw.books.open(r"./myExcel.xlsx") # 会打开当前目录下的myExcel工作簿
app = xw.App() # 会创建一个工作簿
app.books.open('.\LTE.xlsx') # 打开LTE工作簿
import xlwings as xw
xw.Book(r".\实例.xlsx") # 打开一个app,并打开当前目录下的实例工作簿
xw.books.open(r"./myExcel.xlsx") # 会打开当前目录下的myExcel工作簿
app = xw.App(add_book=False) # 不会创建一个工作簿
app.books.open('.\LTE.xlsx') # 打开LTE工作簿
操作工作簿
book.name
:返回工作簿的名字book.sheets
:返回工作簿的所有sheet页(列表)book.app
:返回工作簿所在的App对象(Excel程序)path :(可选)PDF文件保存路径,默认当前目录
include :(可选)包含哪些工作表,单个工作表名 或 多个工作表名的列表
exclude :(可选)不包含哪些工作表,单个工作表名 或 多个工作表名的列表
show :(可选)创建后使用默认应用打开PDF,默认值False
import xlwings as xw
book1 = xw.Book(r"./myExcel.xlsx") # 会打开当前目录下的myExcel工作簿
book2 = xw.books.open("./实例.xlsx")
print(book1.name) # myExcel.xlsx
print(book1.sheets) # Sheets([<Sheet [myExcel.xlsx]Sheet1>])
print(book1.app) # <App [excel] 105928>
print(book2.name) # 实例.xlsx
print(book2.sheets) # Sheets([<Sheet [实例.xlsx]新建工作表-1>, <Sheet [实例.xlsx]Sheet>, <Sheet [实例.xlsx]新建工作表-2>])
print(book2.app) # <App [excel] 105928>
app = xw.App(visible=True, add_book=False)
book3 = app.books.open(".\LTE.xlsx")
print(book3.name) # LTE.xlsx
print(book3.sheets) # Sheets([<Sheet [LTE.xlsx]新建工作表-1>, <Sheet [LTE.xlsx]Sheet>, <Sheet [LTE.xlsx]新建工作表-2>])
print(book3.app) # <App [excel] 118508>
工作表
创建工作表
使用工作簿对象 Book ,「创建」工作表,返回工作表对象 Sheet ,一个 Sheet 对应一个工作表,有两种创建方式:
创建工作表时,可以「设置表名」。参数2中, after 表示插入到某个表后面, before 表示插入到某个表前面。
import xlwings as xw
book1 = xw.Book(r"./myExcel.xlsx") # 会打开当前目录下的myExcel工作簿
book1.sheets.add() # 默认在所以为0的位置新建
app = xw.App(visible=True, add_book=False)
book2 = app.books.open(r".\实例.xlsx")
book2.sheets.add("zjx")
使用工作表
通过工作簿对象 Book ,「使用」指定的工作表,根据工作表的名字/索引/序号,并返回工作表对象 Sheet ,有六种方式:
xw.books['1.xlsx'].sheets['sheet1']
xw.Range('A1').value = 'Python知识学堂' 操作活动的工作表
注意:() 根据 序号 选择,从1开始;[]根据 索引 选择,从0开始。
使用圆括号时里面用Excel惯用的的引用方式(如从1开始的下标),使用方括号时里面用Python惯用的从0开始的下标或切片.
操作工作表
1)工作表名
2)行高列宽
3)导出工作表(不指定路径,默认保存到当前目录)
4)复制工作表
删除工作表
读写单元格
选择单元格
1)按照A1表示法(例:选中A1到B3范围的单元格)
2)按照坐标位置,坐标从左上角起始
3)切片方式选择范围
4)按照单元格名字
写数据到单元格
向指定单元格中写入数据,数据可以是单个值、一维列表、二维列表
sht.range('A1').options(transpose=True).value=[1,2,3] 将1,2,3分别写入了A1,A2,A3单元格中。options(transpose=True) 转置。[1,2,3]是水平列表,在写入excel时,会被转置为垂直向量
读取单元格数据
按照A1表示法,读取指定范围内单元格的数据,读出的数据可以是单个数据
、列表
、二维列表
形式。
sheet.range('A1').value
xw.Range("A1").value 当前活动工作表的单元格的值
xw.Range("A1:B2").value
xw.Range((1,2),(2,2)).value
sheet.range('A2:C2').value
sheet.range('A3:B4').value
sheet.range('1:1').value 会打印出很多没有数据的表格
rows_data = sheet.range('1:5').value 会打印出很多没有数据的表格
a1_c4_value = sht.range('a1:c4').options(ndim=2).value options(ndim=2)会返回二维表格
expand('table')
获取最大行数,和列数 sheet.used_range.last_cell
my_values = sheet
.range('a2:d4').options(ndim=2).value # 读取二维的数据 sheet1
.range('a1').value = my_values
# 复制 a2 到 a6 之间单元格的值,粘贴到'a15'中 sheet
.range('a2','a6').api.Copy(sht.range('a15').api)
import xlwings as xw
book1 = xw.Book(r"./myExcel.xlsx") # 会打开当前目录下的myExcel工作簿
sheet = book1.sheets[0]
print(sheet.range('A1').value) # 1.0
print(sheet.range('A2:C2').value) # [9.0, 8.0, 7.0]
print(sheet.range('A3:B4').value) # [[3.0, 7.0], [4.0, 6.0]]
row_num = 1
print(sheet.range(row_num, 1).expand('right').value) # [1.0, 2.0, 3.0, 4.0]
expand('table')
'table'
是向 'down'
(下方)和 'right'
(右边)扩展,其他可用选项可以分别只在行或者列方向上扩展。
range.offset(row_offset=5,column_offset=2) 表示偏移,row_offset行偏移量(正数表示向下偏移,负数相反),column_offset列偏移量(正数表示向右偏移,负数相反)
注意:是将 选区范围进行偏移,内容不进行偏移
range.expand(mode=’down’) 扩展区域,参数可选取 ‘down’ , ‘right’ ,’table’ ,类似我们使用向下、向右或者下右方的区域扩展操作。
range.resize(row_size=4, column_size=2) 表示调整选中区域的大小,参数表示调整后区域的行、列的数量。
range.current_region 表示全选 类似Ctrl + A
xlwings 还提供了另外一种更加方便的方式来操作一个区域块,通过 expand 或 options 中的 expand 参数,expand 使用的是当前已获取的区域对象,而 options 中的 expand 参数在调用时才计算区域对象,推荐使用 options 中的 expand 参数,是你可以在更改区域后及时获取区域的变化。下面的代码,可以清楚的表达两种方式的不同。
sheet.range('A1').value = [[1,2], [3,4]]
rng1 = sheet.range('A1').expand('table')
rng2 = sheet.range('A1').options(expand='table')
print(rng1.value)
# [[1.0, 2.0], [3.0, 4.0]]
print(rng2.value)
# [[1.0, 2.0], [3.0, 4.0]]
sheet.range('A3').value = [5, 6]
print(rng1.value)
# [[1.0, 2.0], [3.0, 4.0]]
print(rng2.value)
# [[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]]
.expand('down') expand('right')
options(ndim=)
获取最大行数,和列数
import xlwings as xw
book = xw.Book("../openpyxl/实例.xlsx")
sheet = book.sheets[0]
# 区别 expand(), expand()只选中与之连续的单元格。
cell = sheet.used_range.last_cell
rows = cell.row
columns = cell.column
cell1 = sheet.range("a4").expand("down")
max_rows = cell.rows.count # 获取最大行数
print(rows, columns, max_rows)
import xlwings as xw
book = xw.Book(r"./myExcel.xlsx")
sheet = book.sheets[0]
range = sheet["B2:C3"]
print(range.column) # 2 获取单元格(range)区域内第一列的列标
print(range.row) # 2 获取单元格(range)区域内第一行的列标
print(range.count) # 4 单元格(range)区域内单元格的个数
print(range.end("down"))
print(range.last_cell) # <Range [myExcel.xlsx]Sheet1!$C$3> 获得单元格(range)区域内右下角最后一个单元格
print(range.sheet) # <Sheet [myExcel.xlsx]Sheet1> 返回单元格所在的sheet
print(range.rows) # RangeRows(<Range [myExcel.xlsx]Sheet1!$B$2:$C$3>) 返回range的所有行
print(range.rows[0]) # <Range [myExcel.xlsx]Sheet1!$B$2:$C$2> range的第一行
print(range.rows.count) # 2 range的总行数
print(range.columns) # RangeColumns(<Range [myExcel.xlsx]Sheet1!$B$2:$C$3>) 返回range的所有列
print(range.columns[0]) # <Range [myExcel.xlsx]Sheet1!$B$2:$B$3> 返回range的第一列
print(range.columns.count)# 2 返回range的列数
range.autofit() # 所有range的大小自适应
# 所有列宽度自适应
range.columns.autofit()
# 所有行宽度自适应
range.rows.autofit()
设置单元格样式
1)背景颜色
2)行高列宽
3)合并单元格
4)函数公式
5)单元格名字
6)复制粘贴
设置边框
import xlwings as xw
book = xw.Book(r"./myExcel.xlsx")
sheet = book.sheets[0]
cell1 = sheet["A1"]
# Borders(9) 底部边框,LineStyle = 1 直线。
cell1.api.Borders(9).LineStyle = 1
cell1.api.Borders(9).Weight = 3 # 设置边框粗细。
# Borders(7) 左边框,LineStyle = 2 虚线。
cell1.api.Borders(7).LineStyle = 2
cell1.api.Borders(7).Weight = 3
# Borders(8) 顶部框,LineStyle = 5 双点划线。
cell1.api.Borders(8).LineStyle = 5
cell1.api.Borders(8).Weight = 3
# Borders(10) 右边框,LineStyle = 4 点划线。
cell1.api.Borders(10).LineStyle = 4
cell1.api.Borders(10).Weight = 3
# Borders(5) 单元格内从左上角 到 右下角。
cell1.api.Borders(5).LineStyle = 1
cell1.api.Borders(5).Weight = 3
# Borders(6) 单元格内从左下角 到 右上角。
cell1.api.Borders(6).LineStyle = 1
cell1.api.Borders(6).Weight = 3
没有内部区域就不加 ,能加上的就加
import xlwings as xw
book = xw.Book("../openpyxl/实例.xlsx")
sheet = book.sheets[0]
cell_area = sheet.range("A:A")
# # Borders(11) 内部垂直边线。
cell_area.api.Borders(11).LineStyle = 1
cell_area.api.Borders(11).Weight = 3
#
# # Borders(12) 内部水平边线。
cell_area.api.Borders(12).LineStyle = 1
cell_area.api.Borders(12).Weight = 3
删除单元格
删除指定范围的单元格、数据、样式
删除行,剩余行自动上移
import xlwings as xw
book = xw.Book("../openpyxl/实例.xlsx")
sheet = book.sheets[0]
sheet.range('a3').api.EntireRow.Delete() # 会删除 ’a3‘ 单元格所在的行。
添加一行
import xlwings as xw
book = xw.Book("../openpyxl/实例.xlsx")
sheet = book.sheets[0]
sheet.api.Rows(3).Insert() # 会在第3行插入一行,原来的第3行下移。
作者:愈努力俞幸运