1.学习分解不同的Excel文件读写问题,熟悉四种Excel文件读写的问题场景模式。
①单元格读写、②按行读写、③按行取数计算、④按行取数存为字典
2.基于四个项目案例的学习,理解和应用openpyxl相关知识点。
- 项目案例学习
例1
从openpyxl库导入load_workbook函数
from openpyxl import load_workbook
打开【10月员工绩效表】的工作簿,获取活动工作表
performance_wb = load_workbook('./material/10月员工绩效表.xlsx')
performance_ws = performance_wb.active
打开【江宇工资信息表】的工作簿,获取活动工作表
info_wb = load_workbook('./material/江宇工资信息表.xlsx')
info_ws = info_wb.active
获取【绩效】值
performance = performance_ws['D14'].value
获取【奖金】值
bonus = performance_ws['E14'].value
获取【基本工资】值
base = performance_ws['F14'].value
写入【绩效】值
info_ws['E11'].value = performance
写入【奖金】值
info_ws['F11'].value = bonus
写入【基本工资】值
info_ws['G11'].value = base
保存对【江宇工资信息表】工作簿的写入
info_wb.save('./material/江宇工资信息表.xlsx')
总结一下案例一:读取单元格的数据,原样写入,其他已有的工作簿,属于“单元格读写”模式。
案例二是需要从【10月员工绩效表】中提取前十行信息,写入一个新的工作簿。这样,保存后可以用作员工绩效信息的模板表格。
需要获取的数据是【10月员工绩效表】第1到第10行数据范围内的单元格,获取后原样写入到新表格的前10行,保存为【员工绩效表-模板.xlsx】。
从openpyxl库导入load_workbook和Workbook
from openpyxl import load_workbook, Workbook
打开【10月员工绩效表.xlsx】工作簿
performance_wb = load_workbook('./material/10月员工绩效表.xlsx')
获取活动工作表
performance_ws = performance_wb.active
新建工作簿
new_wb = Workbook()
获取活动工作表
new_ws = new_wb.active
获取performance_ws的前十行数据
for row in performance_ws.iter_rows(max_row=10, values_only=True):
# 将数据写入新的工作表
new_ws.append(row)
保存新工作簿为【员工绩效表-模板.xlsx】
new_wb.save('员工绩效表-模板.xlsx')
案例二也顺利完成!它的模式是按行读写,即取出所需数据范围后,按行使用数据,原样写入工作表中。
案例一和案例二,最大的不同点是所取的数据不一样。案例一获取三个单个单元格的数据,案例二则是取出前十行的数据范围。
同时呢,也有两个相同点,都是原样使用数据,而且输出的结果都是写入其他工作表中。
也就是说“获取数据-->如何使用数据-->输出什么结果”的基本结构中,“挥舞”着各自不同的“招式”。
“Excel文件读写”问题分解
我们可以根据“需要获取哪些数据范围”,“如何使用数据”,“如何输出结果”的步骤过程来分析“Excel文件读写类”的问题。
但是这三大步骤问题的“答案”可以有多种变体,从而衍生出不同的功能效果,解决不同的实际需求。
- 获取哪些数据范围
常常与Excel表格打交道的话,你肯定知道,即使是对于同一个工作簿,同一个工作表,人们想要获取的数据就可能千差万别。
比如【10月薪资绩效表】,可能需要江宇的个人数据,也可能需要前十行数据作为模版,还可能需要所有员工的数据进行汇总等等。
根据要获取什么数据范围内的单元格来划分,大致可以分为三类:
1、已知坐标的个别单元格
2、单行或单列范围内的单元格
3、多行多列组成的矩形范围内的单元格
![](https://img.haomeiwen.com/i15336533/0bd3c5a1d7220f8a.png)
这三种范围内的单元格,获取的语法可不相同。你能与之前学过的语法知识点,一一对应起来吗?
![](https://img.haomeiwen.com/i15336533/6819111b39feb74f.png)
所以当遇到Excel文件读写问题,我们首先确认,需要处理的数据是来自哪几个工作簿、哪几个工作表、哪些数据范围的单元格。确认好这个问题,我们就可以选择对应的语法,去获取数据啦。
![](https://img.haomeiwen.com/i15336533/fb2f6a8397230727.png)
-
如何使用数据
取出数据后,就可以使用数据了。
虽然上面两个案例“使用数据”的方式比较简单,但是如果我说出其他的一些操作方式,你也一定能够理解。毕竟它们就源于日常的Excel使用。
那么除了原样的写入数据,我们还可以从行数据中抽取数据,进行计算(数学计算、字符串拼接等),比如通过“提成”与“绩效”之和,得到本月所有奖金的金额。
另外,还可以抽取数据,形成新的数据行,比如抽取出每行第1个和最后1个单元格的内容,得到一行新的数据。当然还可以将获得的数据,存储为Python中的数据类型,以便后续使用。比如把每行数据存为字典类型等等。
image.png
以上是目前总结到的使用数据的四种方式。随着学习不断深入,你还会继续收集其他的使用数据的方式。
-
如何输出结果
数据处理和使用后,肯定会输出一定的数据结果。那么使用完数据,一般会得到什么样新的数据结果呢?
前面我们看到的主要是写入到其他工作表,输出新的工作簿内容。其实“写入到工作表”这种方式下也会有不少细分:
image.png
除了你已经知道的,案例一和案例二中的“写入单元格数据”或“写入行数据”。
还可以“指定”从哪一行写起,“指定”写到具体坐标位置等;还可以写到不同的工作表对象中,比如原工作表、其他已有工作表、或者新建工作簿的工作表等。
另外,如果加上“循环”,还可以同时写到多个不同的工作表中,或者多个不同的坐标位置上。那还会不会还有其他输出结果呢?还可以将处理后的数据直接输出,打印到终端。
image.png
总体而言,我们可以将问题分解划分为三个步骤:获取数据,使用数据,数据输出,各步骤中又蕴含着不同的具体表现。
image.png
再来回顾刚刚的两个项目案例:
像案例一这种,获取的数据是单个单元格;然后将所取数据原样写入到另外的表格。属于典型的单元格读写模式。
像案例二这种,获取的数据是矩形区域的,一般要按行取出;然后将所取数据原样写入到另外的表格中。属于典型的按行读写模式。
案例三:计算并打印奖金信息
依然是从【10月员工绩效表】提取所有员工的工资信息,然后根据每行中员工的“绩效”与“提成”的数值之和,计算出奖金总额,最后按照固定格式输出每位员工的奖金信息。
![](https://img.haomeiwen.com/i15336533/7425c167ae3d7b78.png)
![](https://img.haomeiwen.com/i15336533/412ff6c0a2fb5012.png)
第1点,使用iter_rows()时,要注意values_only参数,其参数值不同,后面获取单元格的代码就会不同。
上图中左侧的代码中,参数值为True,表示“只取单元格的值”,后续使用索引取到的,直接就是单元格的值。后续代码中不需单元格.value语句。
右侧的代码中,默认为False,表示不是“只取单元格的值”,那么使用索引取出的不仅仅是单元格值,而是单元格对象,因此后续的代码都需要增加.value获取单元格的值。
所以,当我们只需取出单元格的值,可以使用values_only = True,使后续代码更加简洁。
第2点就是循环体的缩进。由于提取部分单元格并计算和打
印,都是每获取一条员工信息,就要处理一次。
所以这些语句需要相对上面的for循环有一层缩进。也就是说“使用数据”和“数据输出”作为循环体,要缩进以重复执行
那么按照先获取数据,再使用所获取的数据,最后输出数据结果的流程,就可以顺利完成案例三。
现在我们已经学完了三个案例,案例三与前两个项目案例有什么样的区别呢?
与前两个案例不同,案例三中对于获取的数据进行了处理使用,不再是原样使用。即,从每行数据选取需要的单元格值,并进行加法运算。这种模式是——“按行取数计算”。
案例四:创建薪资信息字典
依然是【10月薪资绩效表】,要从这个总的薪资表中,读取所需数据范围的行数据,然后取出部分信息,将其对应存储在字典中。
事情是这样的,【10月薪资绩效表】中的员工信息比较多,如果要找到某位同事(比如找到江宇的绩效、基本工资等)得按行整个查找一遍。
如果用Python的话,有没有类似Excel软件中的查找功能,能根据人名或者工号等有代表性的关键字,找到这个人所在的行,得到这行的信息呢?当然是可以的。还记得Python中的字典类型吗?字典元素为键值对,根据唯一的键,可以找到对应的值。
所以啊,咱们可以“以工号为键,以每位员工的行数据作为值”,存储成一个“薪资信息字典”。
这样就能让“员工的工号”与“该员工的各项薪资信息”形成映射关系,找到工号就能对应关联到员工信息。
而且利用字典提取键和值的方式,也可以很方便地进行数据查询。
![](https://img.haomeiwen.com/i15336533/34c982ed01caeaf7.png)
网友评论