只要是和数据打交道的人,就避免不了接触 Excel。对于大量的重复性工作,靠人工往往会耗费大量的时间。借助 Python 编程,可以批量自动化完成这些操作,起到事半功倍的效果。
我们知道 Pandas 模块它能够方便快捷地处理 Excel 数据,但是对于 Excel 格式的设置,借助 openpyxl 模块是一个很好的选择,这也是本文的重点内容。
单元格区域调整
有时候,为了让你的 Excel 更加易读,或者基于某种实际需求,需要对单元格区域进行调整。这里一共列出了 5 种常见操作,分别是设置行高和列宽、合并单元格、冻结窗格、添加筛选器。1. 设置行高和列宽
当 Excel 文档中的行、列数过多时,会导致看起来特别费劲。因此可以通过调节单元格的行高和列宽,来帮助我们解决这个问题。在 Office 2013 中,Excel 默认行高是 13.5,默认列宽是 8.38(不同版本的 Excel 可能会有不同)。如果你想根据自己的需求来修改行高或列宽,应该怎么做呢?由于 Excel 文档由多行、多列的单元格组合而成,首先调用工作表对象 row_dimensions 和 column_dimensions 属性,可以帮助我们分别获取所有行、列维度对象组成的列表。接着利用索引的方式,可以获取指定的每个行、列维度对象。最后再调用行、列维度对象的 height 和 width 属性,利用赋值操作,即可完成行高或列宽的修改。对于如图所示的工作簿,如何将第 1 行的行高设置为 50,将第 2 列的列宽设置为 40 呢?from openpyxl import load_workbookwb = load_workbook("两广两湖.xlsx")ws = wb["湖南"]ws.row_dimensions[1].height = 50ws.column_dimensions["B"].width = 40wb.save("两广两湖_修改行高和列宽.xlsx")
在获取工作表对象 ws 后,调用 row_dimensions[1],获取的是第 1 行的行维度对象,再调用 height 属性,利用赋值操作,即可完成行高的设置(见 1)。接着,调用 column_dimensions["B"],获取的是 B 列(第 2 列)的列维度对象,再调用 width 属性,利用赋值操作,即可完成列宽的设置(见 2),最终效果如图所示。2. 合并 / 取消单元格
不管是合并单元格,还是取消单元格,都是为了我们更方便地观察表格。在 openpyxl 模块中,调用工作表对象的 merge_cells() 方法用于合并单元格,unmerge_cells() 方法用于取消合并单元格。一般来说,合并单元格的情况相对较多,这里以“合并单元格”为例为大家讲述。“合并单元格”是以合并单元格区域左上角单元格中的数据为基准,覆盖其他单元格中的数据,而得到一个大的单元格,如图所示。from openpyxl import load_workbookwb = load_workbook("两广两湖.xlsx")ws = wb["湖南"]ws.merge_cells("A1:D6")wb.save("两广两湖_合并单元格.xlsx")
在获取工作表对象 ws 后,调用 merge_cells() 方法,即可完成 “A1:D6” 单元格区域的数据合并(见 1),最终效果如图所示。3. 移动单元格
如果你需要将某行、某列或者某个区域的数据移动到指定位置,应该怎么办呢?
在 openpyxl 模块中,提供了 move_range() 方法来完成这个操作,其语法格式如图所示。如果你还不能使用 move_range() 方法,证明你的 openpyxl 版本过低,升级到更高版本后,再使用这个方法。我们将通过一个案例为大家讲述如何移动单元格,案例文件如图所示。from openpyxl import load_workbookwb = load_workbook("学生台账.xlsx")ws = wb["广东"]ws.move_range("A1", rows=0, cols=5)ws.move_range("C2:C4", rows=3, cols=-2)wb.save("学生台账_移动单元格.xlsx")
在获取工作表对象 ws 后,调用 move_range() 方法,将 “A1” 单元格向右移动 5 个单元格(见 1)。再次调用 move_range() 方法,将 “C2:C4” 单元格区域向左移动 2 个单元格,再向下移动 3 个单元格(见 2),最终效果如图所示。4. 冻结窗口
当 Excel 行数过多时,向下移动表格时表头会被隐藏,此时就无法看出每一列字段所表示的含义,冻结窗口能很好地解决这个问题。
如图所示,我们冻结了 B2 单元格。此时,当向下拖动表格的时候,第一行表头会一直存在。当我们向右拖动表格的时候,第一列数据会一直存在。
在 openpyxl 模块中,调用工作表对象的 freeze_panes 属性,可以帮助我们冻结单元格。在交互式环境中输入如下命令:
from openpyxl import load_workbookwb = load_workbook("两广两湖.xlsx")ws = wb["湖南"]ws.freeze_panes = "B2"wb.save("两广两湖_冻结窗口.xlsx")
在获取工作表对象 ws 后,调用工作表对象的 freeze_panes 属性,利用赋值操作,即可完成对 B2 单元格的冻结(见 1),最终效果只能自己打开 Excel 后查看。小贴士
所谓冻结窗口,冻结的是某个单元格的左侧和上方的区域。因此,冻结 A1 单元格是没有任何效果的。
5. 添加筛选器
为了更加方便、快捷地筛选出自己想要的数据,就需要给某些字段添加筛选器。我们既可以给某个字段添加筛选器,也可以给所有字段添加筛选器,具体介绍如下。- ws.auto_filter.ref = "A1":仅给 A1 这个字段添加筛选器。
- ws.auto_filter.ref = ws.dimensions:为所有字段添加筛选器。
如图所示,我们想要给“性别”“住址”这 2 列添加一个筛选器,应该怎么做呢?from openpyxl import load_workbookwb = load_workbook("两广两湖.xlsx")ws = wb["湖南"]ws.auto_filter.ref = "C1:D1"wb.save("两广两湖_添加筛选器.xlsx")
在获取工作表对象 ws 后,调用工作表对象的 auto_filter.ref 属性,利用赋值操作,给“性别”“住址”这 2 列添加一个筛选器(见 1),最终效果如图所示。自动化excel的完整版文章pdf以及示例的excel源文件和jupyter源文件,我打包上传到网盘,可以私信回复“自动化excel”获取下载地址