【Python】 更棒的Excel操作模块xlwings

2023-05-20,,

【xlwings】

  说到Python操作Excel,有好多模块都可以支持这个工作。比如最底层的win32模块不仅可以操作Excel,还可以操作其他一众windows的软件。

  其他的比较熟悉的有xlrd,xlwt和xlutils这三个。分别负责Excel文件的读、写、读写转换工作。虽然一般情况下的Excel操作都可以通过这三个模块来完成,但是还是有很多不便的地方。比如单元格格式的写入和读取很麻烦,通过xlutils将一个Excel读取再写入到一个新文件中时格式也不会被一起复制过去。

  另外最近我遇到的需求就是,基于一个Excel模板,往里面填充数据。虽然可以将模板转化为xlwt的代码写死在生成脚本中,但是每次都要重新生成一个文件未免太过麻烦,而且一个格子一个格子地写入会让代码量飞速上涨。。无奈之下另寻他路,尝试着用了xlwings这个模块。

■  基本使用

  和xlrd等不同,xlwings设计的基础理念不是面向单个的Excel文档进行的,而是可以处理一个包含了多个Excel文档的“Excel项目”。通过建立其app等逻辑组分概念,可以让整个Excel项目可以更加有序方便地进行计算和互相通讯。xlwings中设计的各个模型的概念层级如下图所示:

  其中App是作为一个逻辑的分组,一个Book可以认为对应一个Excel文档,Sheet对应一张工作表,Range对应具体表中的一片区域的内容。首先,下面是一个最为常见的,打开一个Excel文档并进行处理的简单过程:

import xlwings as xw

book = xw.Book('/path/to/test.xlsx')
# 此时界面上会弹出Excel窗口,如果test.xlsx文件不存在则会报错,如果test.xlsx已经被打开,直接返回这个文件对象 print book.name,book.fullname # 打印文件名和绝对路径
print book.app # 可以查看book所在哪个APP
print book.sheets # 又是一个类列表结构,存放各种Sheet对象
book.activate() # 如果Excel没有获得当前系统的焦点,调用这个方法可以回到Excel中去
book.close() # 关闭Excel文档,但只是关闭文件本身,不关闭excel程序。。若要关闭Excel程序则需要调用响应APP实例的kill方法。经过试验,先调用close会导致默认创建的app实例自动消失,从而无法调用kill,从而关不掉Excel
所以最好的办法不是调用这个close而是调用app.kill()。
sheet = book.sheets[0]
# 其他获取sheet对象的方法还有book.sheets['sheet_name']

  上面说到了获取一个具体的sheet,然一个sheet可以调用的方法有:

 sheet.activate       sheet.charts         sheet.index
sheet.api sheet.clear sheet.name
sheet.autofit sheet.clear_contents sheet.names
sheet.book sheet.delete sheet.pictures
sheet.cells sheet.impl sheet.range
...等等

  其中activate,autofit,cliear_content等这些方法都还挺有意思的。最为核心的方法应该就是range了,通过它可以获取到具体的某一段范围的数据。

  例如sheet.range('A1')获取到A1单元格的对象,通过调取此对象的value属性,就可以读取/改变单元格的值,并且这一切都不会影响单元格本身的格式。

  更加imba的一种做法是sheet.range('A1:C3')这样的形式可以一次性获取到一个区域内所有单元格的对象。调取其value对象的话得到的也是一个二维列表形式的数据集合,可以形象方便地把Excel中的数据映射到python中来。对于设置数据时,传入数据可以是一个不符合指出区域规定的结构,但是这样结果会比较微妙。。建议实验

  需要指出的是和xlrd一样,读取value时合并单元格只在其左上角的子单元格中有值,其余的和未填写的单元格一样,都是None。

■  对于range,能做的还有更多

  除了简单的调用value和为value赋值来读写Excel外,还有如下接口可以使用

 range.add_hyperlink  range.clear_contents range.count
range.address range.color range.current_region
range.api range.column range.end
range.autofit range.column_width range.expand
range.clear range.columns range.formula
...等等

  一些接口的用法提示:

  range.add_hyperlink('https://www.baidu.com','百度')

range.color = (128,128,128)    RGB通道颜色,可获取or设置

  range.row/column  获取第几行/列,注意是第几而不是下标

  range.formula  可以设置计算表达式,用来进行表内计算

  range.current_region  返回当前range所在区域的区域表达,这个比较难描述,好比一个Excel中互相连接的单元格都是连城一片,两个片之间没有任何相邻就是互相独立的。

  range.count  返回这个range中共有多少单元格,合并单元格仍然按未合并的算

  range.offset(a,b)  获取到当前range向右a格,向下移动b格同样大小的那片区域,ab可以为负值

  range.rows/columns  返回行/列的各个range对象

  

■  关于App

  其实App还没有仔细研究过,简单来说,当通过xw.Book创建一个实例的时候,默认向xw.apps中添加一个App实例,而book就属于这个App。

  如上面所说,解决Excel程序无法关闭的问题可以用这个app实例的kill方法。app.kill()可以把Excel程序连同文件一并关闭。另外,如果不想让Excel程序跳出来则可以置app.visible=False,即时设置即时生效。

  由于通常我们的操作基于Book类对象,当完成操作book.save之后,如果想要关掉Excel,可以调用book.app.kill()或者book.app.quit(),但在这之前不要book.close(),否则会报错哦。(推荐使用quit,使用kill的话有些excel打开软件比如WPS会记录下非正常的退出状态,当再次打开这个文档的时候就会报错说有错误。如果第二次仍然使用xlwings打开,而错误提示的对话框占据了焦点,会使得xlwings无法正常使用)。

  

【Python】 更棒的Excel操作模块xlwings的相关教程结束。

《【Python】 更棒的Excel操作模块xlwings.doc》

下载本文的Word格式文档,以方便收藏与打印。