【笔记】Xlwings学习笔记

前言

Python3利用Xlwings模块实现Excel的办公自动化

安装模块

1
pip install xlwings

快速入门(通过with…as)

1
2
3
4
5
6
7
8
9
10
11
12
import xlwings

# 创建应用程序对象
with xlwings.App() as app:
# 在应用程序上创建工作簿
book = app.books.add()
# 在工作簿中创建工作表
sheet = book.sheets.add()
# 修改单元格内的值
sheet.range("A1").value = "值"
# 保存到文件
book.save("./filename.xlsx")

快速入门

A1:单元格坐标
:写入单元格的数据

1
2
3
4
5
6
7
8
9
10
11
12
import xlwings

# 在新的应用程序上创建新的工作簿
book = xlwings.Book()
# 在工作簿上选择工作表
sheet = book.sheets["Sheet1"]
# 修改单元格内的值
sheet.range("A1").value = "值"
# 保存工作簿
book.save()
# 退出工作簿
book.close()

对Excl应用程序的操作

启动一个新的应用程序

  • 需要安装Microsoft Office Excl

参数列表

visiable=None:是否可视

True:可视
False:不可视
spec=None:指定Excl程序的位置
如果是Windows,就在设置中指定默认的Excl打开方式
如果是Mac,可以直接在这里传递Excl应用程序的路径
add_book=True:是否在打开应用程序时自动创建工作簿
True:自动创建工作簿
False:不自动创建工作簿

1
app = xlwings.App()

激活应用程序

  • 将焦点从Python转移到Excl上
1
2
3
app.activate()

app.activate(steal_focus=True)

退出应用程序

1
app.quit()

关闭应用进程

1
app.kill()

获取应用程序对象的pid

1
app.pid

是否显示Xlwings对Excl的操作过程

True:显示Xlwings对Excl的操作过程
False:隐藏Xlwings对Excl的操作过程

1
app.display_alerts = False

是否显示操作过程中的对话框

True:显示操作过程中的对话框
False:隐藏操作过程中的对话框

1
app.screen_updating = False

对所有Excl应用程序的操作

获取所有应用程序对象

  • 返回一个应用程序对象列表
1
xlwings.apps

获取指定应用程序对象

  • 通过pid获取一个已经创建的应用程序对象

<pid>:指定对象的pid

1
app = xlwings.apps[<pid>]

获取所有应用程序对象的个数

1
xlwings.apps.count

对工作簿的操作

  • 通过应用程序对象对工作簿的操作

app:应用程序对象

创建工作簿对象

创建新的工作簿

在新的应用程序上创建工作簿
  • 创建一个新的应用程序对象,然后利用这个对象创建一个新的工作簿

<name>:指定文件名

1
2
3
book = xlwings.Book()

book = xlwings.Book("<name>")
在当前选中的应用程序上创建工作簿

<name>:指定文件名

1
2
3
book = app.books.add()

book = app.books.add("<name>")

使用已经存在的工作簿

  • 使用已经存在的工作簿获取工作簿对象
在新的应用程序上打开工作簿

<src>:Excl文件的路径

1
book = xlwings.Book(r"<src>")
在当前选中的应用程序上打开工作簿

<src>:Excl文件的路径

1
book = app.books.open(r"<src>")

保存工作簿

  • 如果不指定文件的保存路径,会默认在当前目录保存名为工作簿1.xlsx的文件
  • 如果保存时文件名相同,那么表示保存
  • 如果保存时文件名不同,那么表示另存为

<src>:指定文件的保存路径

1
2
3
book.save()

book.save("<src>")

关闭工作簿

1
book.close()

对工作表的操作

  • 通过工作簿对象对工作表的操作

book:工作簿对象

创建工作表

  • 如果不指定排列的位置,那么默认将新的工作表放到最前面

before="":将新创建的工作表放到指定表前面
after="":将新创建的工作表放到指定表后面

1
2
3
book.sheets.add()

book.sheets.add("工作表名")

获取工作表对象

  • 创建工作簿后可以直接使用自动创建的工作表

通过工作表名获取

1
sheet = book.sheets("工作表名")

通过工作表索引获取

  • 索引从1开始
1
sheet = book.sheets(1)

获取当前处于焦点的工作表

1
sheet = book.sheets.active

获取工作表数量

1
sheet.count

获取当前工作表名

1
sheet.name

获取当前工作表索引

1
sheet.index

删除工作表

1
sheet.delete()

对单元格的操作

  • 通过工作表对象对单元格的操作

app:应用程序对象
sheet:工作表对象

自动调整行高或列宽

1
2
3
4
5
# 自动调整行高
sheet.autofit("1")

# 自动调整列宽
sheet.autofit("A")

获取所有单元格

1
sheet.cells

选取单元格

选取一个单元格

"A1":单元格编号,字母表示当前单元格列编号,数字表示当前单元格行编号
(1, 1):数轴坐标,左上角单元格视为(1,1)点,第一个数表示行索引,第二个数表示列索引

通过类对象选取单元格
1
2
cell = xlwings.Range("A1")
cell = xlwings.Range((1, 1))
通过app对象选取单元格
1
2
cell = app.range("A1")
cell = app.range((1, 1))
通过sheet对象选取单元格
1
2
cell = sheet.range("A1")
cell = sheet.range((1, 1))
通过sheet数组选取单元格
1
2
cell = sheet["A1"]
cell = sheet[0, 0]

选取一组单元格

  • 选取一个矩形区域的一组单元格

A1:B2:利用单元格编号选取,第一个编号表示选取区域的左上角,第二个编号表示选取区域的右下角
(1, 1), (2, 2):利用两个数轴坐标来选取,第一组坐标表示选取区域的左上角

通过类对象选取单元格
1
2
xlwings.Range("A1:B2")
xlwings.Range((1, 1), (2, 2))
通过app对象选取单元格
1
2
app.range("A1:B2")
app.range((1, 1), (2, 2))
通过sheet对象选取单元格
1
2
sheet.range("A1:B2")
sheet.range((1, 1), (2, 2))
通过sheet数组选取单元格
1
sheet["A1:B2"]
从左上角开始选取
  • 从左上角开始选取,一直选取到指定的行和列

2:指定选取区域右下角单元格所在的行数
3:指定选取区域右下角单元格所在的列数

1
sheet[:2,:3]

将选中的区域偏移

  • 只偏移选中的区域,不改变数据

row_offset=1:行偏移,正数表示向下偏移,负数表向上偏移
column_offset=1:列偏移,正数表示向右偏移,负数表向左偏移

1
cell.offset(row_offset=1, column_offset=1)

调整选中区域的大小

  • 只调整选中的区域,不改变数据

row_size=1:调整后选中的行的数量
column_size=1:调整后选中的列的数量

1
cell.resize(row_size=1, column_size=1)

选取全部有数据的单元格

1
sheet["A1"].expand("table")

扩展区域

  • 自动填充扩展区域

mode="":填充的模式

down:向下填充
right:向右填充
table:向右下填充

1
cell.expand(mode="")

修改单元格内容

赋值为单个数据

1
cell.value = ""

赋值为一组数据

横向填充一组数据
  • 将一组数据从当前单元格位置横向赋值到临近的单元格
1
2
3
4
5
cell.value = []

cell.options(transpose=False).value = []

cell.options(expand="right").value = []
纵向填充一组数据
  • 将一组数据从当前单元格位置纵向赋值到临近的单元格
1
2
3
cell.options(transpose=True).value = []

cell.options(expand="down").value = []
斜向填充一组数据
  • 将一组数据从当前单元格位置向右下方向选中一个矩形区域进行填充

1:为选中区域第1行第1列赋值
2:为选中区域第1行第2列赋值
3:为选中区域第2行第1列赋值
4:为选中区域第2行第2列赋值

1
cell.options(expand="table").value = [(1, 2), (3, 4)]

自动填充扩展区域

mode="":填充的模式

down:向下填充
right:向右填充
table:向右下填充

1
cell.expand(mode="")

获取单元格内容

一维的数据

1
2
3
cell.value

cell.value.options(ndim=1)

二维的数据

1
cell.value.options(ndim=2)

修改单元格样式

修改表格背景色

1
2
3
cell.color = (255, 255, 255)

cell.color = 0xFFFFFF

合并/取消合并单元格

  • api对象访问的是winpy32对象,所以这些操作只能在Windows上生效

cell:选择一组相邻的单元格对象

1
2
3
cell.api.merge()

cell.api.unmerge()

修改字体样式

设置字体名称

<name>:字体名称

1
cell.api.Font.Name = <name>

设置字体颜色

1
2
3
cell.api.Font.Color = (255, 255, 255)

cell.api.Font.Color = 0xFFFFFF

设置字体字号

<num>:字号

1
cell.api.Font.Size = <num>

设置字体加粗

1
cell.api.Font.Bold = True

修改文字对齐方式

水平对齐方式

<num>:参数

-4108xlwings.constants.HAlign.xlHAlignCenter:缺省值,水平居中
-4131:水平靠左
-4152:水平靠右

1
cell.api.HorizontalAlignment = <num>

垂直对齐方式

<num>:参数

-4108xlwings.constants.VAlign.xlHAlignCenter:缺省值,垂直居中
-4160:垂直靠上
-4107:垂直靠下
-4130:自动换行对齐

1
cell.api.VerticalAlignment = <num>

修改边框样式

选择想要设置的边框

<num>:参数

5:从区域中每个单元格的左上角到右下角的边框
6:从区域中每个单元格的左下角到右上角的边框
7:区域左边框
8:区域顶边框
9:区域底边框
10:区域右边框
11:区域中所有单元格的垂直边框
12:区域中所有单元格的水平边框

1
cell.api.Border(<num>)

设置边框类型

<type>:参数

1:实线
-4115:虚线
4:1点1划相间线
5:2点1划相间线
-4118:点式线
-4119:双线
-4142:无线
13:倾斜的划线

1
2
3
cell.api.Borders.LineStyle(<type>)

cell.api.Borders(<num>).LineStyle(<type>)

边框粗细

  • Office2016不能设置粗细

<weight>:粗细值

1
2
3
cell.api.Borders.Weight(<weight>)

cell.api.Borders(<num>).Weight(<weight>)

修改数据格式

  • 例如设置保留2位小数
1
cell.api.NumberFormat = "0.00"

删除单元格

  • 将单元格删除,当前列后面的所有单元格会向上移动
1
cell.delete()

删除整行/整列

指定行编号/列编号

1:行编号,冒号两侧的值相同
A:列编号,冒号两侧的值相同

1
2
3
sheet.range("1:1").delete()

sheet.range("A:A").delete()
指定单元格
  • 删除指定单元格所在的行或列
1
2
3
cell.api.EntireRow.Delete()

cell.api.EntireColumn.Delete()

清楚单元格数据或样式

清除所有单元格的数据

1
sheet.clear_contents()

清除所有单元格的数据和格式

1
sheet.clear()

清除指定单元格的数据

1
cell.clear_contents()

清除指定单元格的数据和格式

1
cell.clear()

获取最后一行/列

  • 获取指定单元格所在列有数据的部分的最后一行
1
cell.current_region.last_cell.row
  • 获取指定单元格所在行有数据的部分的最后一列
1
cell.current_region.last_cell.column

从当前列第一行选取到最后一行

1
sheet["A1:A{}".format(sheet["A1"].current_region.last_cell.row)]

将颜色转换成数值

1
xlwings.utils.rgb_to_int((255, 255, 255))

完成

参考文献

哔哩哔哩——千锋教育