01 xlwings的基本操作
python现在有很多可以支持操作EXCEL的包了,xlwings 就是一个很牛的,我们可以通过调用这个包实现各种各样的表格操作功能,可以通过命令import xlwings as xw 先导入一下包,如果没有就pip install一下,下面介绍一些最常用的:
1. 基础操作
(1)打开EXCEL应用程序
| # 可见模式 - 你会在屏幕上看到Excel窗口
app_visible = xw.App(visible=True)
# 不可见模式 - Excel在后台运行,你看不到窗口
app_hidden = xw.App(visible=False)
app.display_alerts = False # 不显示警告框
app.screen_updating = False # 不显示屏幕更新
|
一般为了操作的顺畅性,我们让应用程序不可见就行,但是记得在处理完之后,关闭不需要的进程,以节约运行资源。同时display_alerts 和 screen_updating 的设置,也是为了减少不必要的内存开销,让整个运行更流畅。
| 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应用程序
| app = xw.App(visible=False)
app.quit() # 程序退出
app.kill() # 通过杀掉进程,强制Excel app退出
|
一般运行完一段代码之后,节约内存都会退出,也就是 app.quit(),后面为了方便,我就都省略,大家知道这个事就行。而app.kill() 则是一种更暴力的退出,直接通过杀死进程实现。
(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)打开工作簿并写入内容
| 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)复制和粘贴
| 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实现,当然实际操作中这种方法容易卡顿
| # 单个单元格剪切
ws.range("A1").api.Cut(ws.range("B1").api)
# 区域剪切
ws.range("A1:D10").api.Cut(ws.range("F1").api)
|
因此我们可以通过“复制+删除”的方式,模拟剪切操作,如下:
| 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) 激活工作表
| wb.activate() # 相当于我们在EXCEL中点击了某个工作表进行查看
# 如果steal_focus=True, 则把窗口显示到最上层,看到的就是EXCEL而不是python页面了
wb.activate(steal_focus=True)
|
3. 格式修改
(1)字体和字号
| 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)单元格样式
| # 定义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)对齐方式
| # 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)删除单元格内容
| ws.range("a1:e10").clear() # 清空内容和格式
# ws.range("a1:e10").clear_contents() # 仅清除内容
# ws.range("a1:e10").clear_formats() # 仅清除格式
|
这里只是总结了一些最常用的属性和方法,但是表格的操作远不止于此,更多的操作可以参考xlwings官方文档