跳转至

01 xlwings的基本操作

python现在有很多可以支持操作EXCEL的包了,xlwings 就是一个很牛的,我们可以通过调用这个包实现各种各样的表格操作功能,可以通过命令import xlwings as xw 先导入一下包,如果没有就pip install一下,下面介绍一些最常用的:

1. 基础操作

(1)打开EXCEL应用程序

1
2
3
4
5
6
7
8
# 可见模式 - 你会在屏幕上看到Excel窗口
app_visible = xw.App(visible=True)

# 不可见模式 - Excel在后台运行,你看不到窗口
app_hidden = xw.App(visible=False)

app.display_alerts = False # 不显示警告框
app.screen_updating = False # 不显示屏幕更新
一般为了操作的顺畅性,我们让应用程序不可见就行,但是记得在处理完之后,关闭不需要的进程,以节约运行资源。同时display_alertsscreen_updating 的设置,也是为了减少不必要的内存开销,让整个运行更流畅。

1
2
3
4
5
app = xw.App(visible=True,add_book=True) # 可见,新建一个工作簿

pid = app.pid # 获取当前进程ID
print(pid)
print(xw.apps.count) # 1
在运行中如果想要看见EXCEL界面,就可以使用visible=True,并且add_book=True,那么就可以看见在程序运行的过程中新建了一个工作簿,而不是只打开了EXCEL应用程序,每打开一个EXCEL,就会有一个关于此应用的进程号,可以通过pid 来获取。

(2)关闭EXCEL应用程序

1
2
3
app = xw.App(visible=False)
app.quit() # 程序退出
app.kill() # 通过杀掉进程,强制Excel app退出
一般运行完一段代码之后,节约内存都会退出,也就是 app.quit(),后面为了方便,我就都省略,大家知道这个事就行。而app.kill() 则是一种更暴力的退出,直接通过杀死进程实现。

(3)新建一个工作簿并保存

1
2
3
app = xw.App(visible=False)
wb = app.books.add()
wb.save(r'C:\Users\22330\Desktop\进行中\data\xlsx\新工作簿.xlsx')
这样我们就通过 app.books.add 方法新增了一个文件,如果需要删除,则使用 os.remove 即可。

(4)新建一个工作表sheet

ws = wb.sheets.add() # 添加一个工作表sheet
ws.name = "新sheet"

但是需要注意的是,工作表sheet是默认往前创建的,也就是在sheet1的位置前面,但是往往我们想往后创建,于是就可以使用下面的这段代码实现:

ws = wb.sheets.add(after=wb.sheets(wb.sheets.count)) # 代表在所有表格sheet之后创建
ws.name = "新sheet"

如果是删除呢,直接使用ws.delete()即可

(5)打开工作簿并写入内容

1
2
3
4
5
wb = app.books.open(r'C:\Users\22330\Desktop\进行中\data\xlsx\新工作簿.xlsx')
ws = wb.sheets[0] # 这个sheet是从左往右数第一个,下标索引的规则
# 如果需要按名字索引,就可以这么写
# ws = wb.sheets("Sheet1")
ws.range("a1").value = "hello world"
同时如果我们需要对一块区域赋值,只需要修改区域范围即可,比如 a1:b10 我们写作:

ws.range("a1:b10").value = "hello world"

(6)读取具体区域的内容

print(ws.range("a1").value) # 输出 hello world
当然如果是读取一个区域的内容,xlwings 会把它转换成一个二维数组,例如:

print(ws.range("a1:b3").value)

内层代表每一行,然后纵向堆叠组成一个二维数组,由于其他地方没有填值,因此输出:

[['hello world', None], [None, None], [None, None]]

2. 常见操作

(1)复制和粘贴

1
2
3
4
5
6
7
ws = wb.sheets[0] # 同一个sheet里做复制
ws.range("a1").copy(ws.range("b1"))

ws2 = wb.sheets[1] # 不同sheet里做复制
ws.range("a1").copy(ws2.range("a1"))

ws.range("a1:d10").copy(ws2.range("a1")) # 区域的复制,粘贴的位置选择左上角第一个单元格即可
复制和粘贴一般通过copy方法实现,如上,源数据区域写开始,目的区域放括号中

(2)剪切

但是xlwings不提供直接的剪切的方法,而是需要调用api下的Cut实现,当然实际操作中这种方法容易卡顿

1
2
3
4
# 单个单元格剪切
ws.range("A1").api.Cut(ws.range("B1").api)
# 区域剪切
ws.range("A1:D10").api.Cut(ws.range("F1").api)

因此我们可以通过“复制+删除”的方式,模拟剪切操作,如下:

1
2
3
4
sourse_area = ws.range("a1:d10") # 源数据
target_area = ws2.range("a1") # 目标数据
sourse_area.copy(target_area) # 复制源数据到目标数据
sourse_area.clear() # 清空源数据

(3)合并单元格

合并单元格我们直接使用merge方法实现,给定一个区域,调用此方法即可,如下:

ws.range("a1:e3").merge()

(4) 激活工作表

1
2
3
wb.activate() # 相当于我们在EXCEL中点击了某个工作表进行查看
# 如果steal_focus=True, 则把窗口显示到最上层,看到的就是EXCEL而不是python页面了
wb.activate(steal_focus=True)

3. 格式修改

(1)字体和字号

1
2
3
4
5
ws.range("a1").font.size = 20
ws.range("a1").font.name = "楷体"
ws.range("a1").font.bold = True # 粗体
ws.range("a1").font.italic = True # 斜体
ws.range("a1").font.color = (255,0,0) # 红色,通过RGB给值
关于字体的相关设置都可以在range.font属性下找到

(2)单元格样式

1
2
3
4
5
6
7
8
9
# 定义RGB颜色转换函数
def RGB(red, green, blue):
    """将RGB值转换为Excel颜色格式"""
    return red + (green * 256) + (blue * 65536)

ws.range("g1:i9").api.Interior.Color = RGB(255, 0, 0) # 红色
ws.range("g1:i9").api.Borders.LineStyle = 1 # 边框线样式,实线
ws.range("g1:i9").api.Borders.Color = RGB(0, 0, 255) # 蓝色
ws.range("g1:i9").api.Borders.Weight = 2 # 边框线宽

xlwings中,如果要调整单元格的样式,也需要引用api下的一些方法,同时需要将RGB值转换成对应的EXCEL颜色格式

(3)对齐方式

1
2
3
4
5
6
7
# ws.range("g1:i9").api.HorizontalAlignment = -4108 # 居中对齐
# ws.range("g1:i9").api.HorizontalAlignment = -4152 # 右对齐
ws.range("g1:i9").api.HorizontalAlignment = -4131 # 左对齐

# ws.range("g1:i9").api.VerticalAlignment = -4108 # 居中对齐
# ws.range("g1:i9").api.VerticalAlignment = -4160 # 上对齐
ws.range("g1:i9").api.VerticalAlignment = -4107 # 下对齐

分为水平对齐和垂直对齐两种方式,各个对应的参数如上

(4)删除单元格内容

1
2
3
ws.range("a1:e10").clear() # 清空内容和格式
# ws.range("a1:e10").clear_contents() # 仅清除内容
# ws.range("a1:e10").clear_formats() # 仅清除格式

这里只是总结了一些最常用的属性和方法,但是表格的操作远不止于此,更多的操作可以参考xlwings官方文档