编程语言 Python 现如今如日中天,之所以如此繁荣,除了易学易学的特点之外,应用场景更广也是主要因素之一。除 Web 开发,科学计算,AI 人工智能外,日常办公也有 Python 的用武之地,今天我们来学习 Python 操作 Excel。
Python 用于操作 Excel 的库有很多,如:xlwings、pandas、xlsxwriter 等,今天我们用到的是很受欢迎的 openpyxl,官档地址:https://openpyxl.readthedocs.io/en/latest/ ,该库可以读写 Excel xlsx/xlsm/xltx/xltm。
编程初学者在学习一个新库或框架时,往往会觉得要记的东西比较多,面对满屏的函数、方法、属性不知所措,觉得需要死记的东西太多,导致学习效率很低!有这种现象的一个主要原因是未深入理解面向对象编程,今天我们以 openpyxl 学习为例,换种思维方式,融入OOP 理念,你会发现编程其实很简单。
面向对象编程思想一个主要特点即是以人的思维习惯去分析、分解问题,简单来讲,可以将事物抽象为类,将对象所具备的特征和行为抽象为方法,代码的定义抽象都是为描述、抽象现实中事物交互行为而服务的。
openpyxl 第三方功能库,而非标准库内置,因而使用前先安装到当前 Python 环境,操作系统命令行下 `pip install openpyxl `即可安装,目前最新版本为 2.6.3
作为对比学习,我们打开 MS Office Excel 套件(本例为 Office 2016),看下基本界面:
Office Excel 基本界面及术语
先抛开代码,从非开发人员角度,我们可以总结发现几个对象:
- 工作簿,即整个文档
- 工作表,工作簿下的表格标签,一个工作簿可以包含多个工作表
- 行,横行多个单元格的序列,以数字标识序号
- 列,纵向多个单元格的序列,以字母标示序号
- 单元格,行列交汇,用于填写值的网格
接下来,同样以非开发人员即普通办公人员角度想象一下创建一个表格的几个步骤:
- 使用 Excel 软件创建一个工作簿对象
- 使用默认工作表(Sheet),或自定义新增、编辑,双击修改工作表的标签名称
- 定位行/列,单元格,填充输入值
- 保存当前工作簿,可以指定文件名称,如:data.xlsx
前述以普通用户角度分解了操作对象及过程,若以面向对象编程思想来分析,便可以将前面的对象和过程作以下归纳:
- 工作簿(对象)
- 特征:名称、包含式个工作表
- 行为:载入、存储……
- 工作表(对象)
- 特征:标题文字、标签颜色……
- 行为:获取当前、获取所有工作表……
- 单元格:
- 特征:所在行、所在列、值……
- 行为:略……
不论哪种编程语言,符合面向对象编程思想的代码通常总是定义一组相关的类,用于抽象相关的对象,并将该对象具有的特征和行为抽象为属性和方法。openpyxl 即符合这个机制和原则,理解这一点,有助于深入理解代码组织形式,启发思维。
接下来我们以程序的角度来分析分解前述创建工作簿、切换到指定工作表,并在特定单元格填充内容,最终命名保存。原本由原来的 Office Excel 完成的工作,现在有 Python openpyxl 编程实现(内存中操作)。
步骤:
1、内存创建工作簿对象:
创建 工作簿
openpyxl.Workbook 类抽象工作簿对象,wb 作为在内存中的对象引用
此时,相当于 Excel 软件创建一个空的工作簿
相当于 Excel 执行结果
2、 找到工作簿当前激活的工作表
对应工作表操作
此时相当于定位切换至默认的工作表 “Sheet1”
对应 Excel 操作结果
此时可以修改内存工作簿工作表 Sheet1 的标题名称
修改工作表标题属性
相当于 Excel 双击改变工作表标签文字
对应 Excel 操作结果
3. 操作单元格
定位行列单元格(由 Cell 类抽象)
定位获取单元格对象引用
在单元格内填充值
获取或设置单元格 value 值
Cell.value 表示该单元格值, ws.rows 包含有数据的行集合
此时,相当于 Excel 结果:
对应 Excel 结果
如果我们有批量的数据,可以计算好行列索引,以批量写入单元格
计算好行列索引,批量写入单元格内容
此时,相当于 Excel 结果:
对应 Excel 结果
4. 保存工作簿至文档
截止目前,所有的操作均映射在内存中,wb.save(‘名称.xlsx’) 可以保存文档至当前位置
wb.save() 保存工作簿
使用 Excel 打开程序保存的 scores.xlsx 文件,我们发现最终生成的文档与期望结果保持一致
最终保存的 Excel 文档结果
本文以面向对象编程思维方式介绍了 openpyxl 库的 Excel 基本操作处理,更多操作如:批量单元格处理、图片插入、加载文档等,小伙伴们可以使用同样的思维方式思考对应功能在库中可能会有什么样的对象类来抽象,以及什么样的属性方法分别映射特征和行为!理解这一样,即使对查询帮助也有更清晰的认识!