
书接上回,可能大家看得不够尽兴,因为没有提到很多代码(大家可以理解成积攒能量吧),为什么这么做呢,因为我想把核心的代码集中到一篇当中,不让第一篇的篇幅过长,如果没有看过前面那一篇文章的同学可以去浏览一下。
好的回归正题,打开(创建)完文件之后,我们首先要选择一个sheet(工作表),有可能一个excel文件中有很多个sheet,所以我们需要获取到这写sheet对象,这里有两种办法,第一是直接得到一个对象列表,另外一个是获取到所有sheet的名称,再按照名称索引获取具体的sheet对象。
from openpyxl import load_workbook wb = load_workbook(r'xxxx') # 利用 worksheets 方法获得sheets列表 sheets = wb.worksheets # [sheet对象, sheet对象, sheet对象, sheet对象] 返回的就是这样一个全是sheet对象的列表 sheet = sheets[0] # 获取列表中的偏移量为零的值也就是第一个元素
取到 sheet 后我们可以遍历每一行,看一下返回什么
from openpyxl import load_workbook
wb = load_workbook(r'xxxx')
sheets = wb.worksheets
sheet = sheets[0]
# for 循环遍历 row
for row in sheet.iter_rows():
print(row)
# 以下是输出:
(, , , , , , , , , , , , )
(, , , , , , , , , , , , )
(, , , , , , , , , , , , )
(, , , , , , , , , , , , )
(, , , , , , , , , , , , )
(, , , , , , , , , , , , )
(, , , , , , , , , , , , )
(, , , , , , , , , , , , )
(, , , , , , , , , , , , )
(, , , , , , , , , , , , | )
# ...... | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
我们发现每一行返回了一个元组,每个元组的每一个元素都是一个单元格对象,这样我们就可以利用下标的方式获取到某一列(由于我们遍历了每一行,那么每一行的第二个元素输出就变成了第二列,注意第二列的下表索引值是1)
from openpyxl import load_workbook
wb = load_workbook(r'xxxx')
sheets = wb.worksheets
sheet = sheets[0]
# for 循环遍历每一行的第二列
for row in sheet.iter_rows():
print(row[1])
# 以下是输出:
|
#...... | | | | | | | | | |
有同学到这里就迷惑了,我要看的是具体的数据,你给我这些对象有啥用呀,别急,获取到对象之后,只要执行其中的value方法即可,这里可能有些同学会问为什么value方法没有加括号,其实是因为它使用了 @property 装饰器,使用了这个装饰器在执行时就不需要加上括号了,我们来看看结果
from openpyxl import load_workbook
wb = load_workbook(r'xxxx')
sheets = wb.worksheets
sheet = sheets[0]
# for 循环遍历每一行的第二列
for row in sheet.iter_rows():
print(row[2].value)
# 以下是输出:
cost
4075
1500
5321
6699
3000
5550
3268
2522
4855
2900
# ......
这里在将讲一下如果说我们不是想整列输出或者操作,比如说我们像跳过表头,这时候我们就可以设置遍历的最小起始行(min_row),如果我不想读最后一行,我们就设置最大结束行(max_row),注意在读取具体的行和列的时候下标从1开始,只有在读取元组,列表和python中的其他数据结构时,下标索引才从 0 开始
from openpyxl import *
wb = load_workbook(r'C:Users86189Desktophe cost list.xlsx')
sheets = wb.worksheets
sheet = sheets[0]
# 设置最小开始行为2,最大结束行为3
for row in sheet.iter_rows(min_row=2, max_row=3):
print(row[2].value)
# 下面是输出:
4075
1500
# ......
当然上面都是一行一行,一列一列处理的情况,那么这时候假如我已经知道了一个单元格的坐标或者说我知道他在表中的绝对位置,我能不能获取到这个单元格对象呢,当然是可以的,比如我想获取”A2“这个单元格对象,那么我们可以直接使用下标查找:
from openpyxl import * wb = load_workbook(r'C:Users86189Desktophe cost list.xlsx') sheets = wb.worksheets sheet = sheets[0] # 通过下标’A2‘查找 print(sheet['A2']) # 输出单元格对象的值 print(sheet['A2'].value) # 下面是输出:| 2019-08-01 00:00:00 |
那么我如果想获取第一行第一列的单元格怎么办呢,这时候 sheet 对象里面有一个cell(x, y)方法,支持通过绝对位置来获取单元格对象,并通过value方法获得它的值
from openpyxl import * wb = load_workbook(r'C:Users86189Desktophe cost list.xlsx') sheets = wb.worksheets sheet = sheets[0] # 获取(2,1)坐标的单元格 cell = sheet.cell(2, 1) print(cell) # 获取单元格的内容 print(cell.value) # 输出如下:| 2019-08-01 00:00:00 |
还有很多很多读的问题,因为大家可能平时运用的不够多,这里我就给大家举一个具体的例子,然后希望对大家有帮助
需求:在一个学习时间表中找出年龄小于14岁且学习时间超过6小时的学生
1.首先我们先来看看表,当然不是通过直接打开的方式,是通过我们python代码的形式。
from openpyxl import *
wb = load_workbook(r'C:Users86189Desktop学习时间记录表.xlsx')
sheets = wb.worksheets
sheet = sheets[0]
# 遍历sheet中的每一行
for row in sheet.iter_rows():
# 遍历每一行的每一个单元格
for cell in row:
# 输出每个单元格,但结尾不是换行符,改成制表符
print(cell.value, end='t')
# 每一行的信息输完后1换行
print()
# 输出结果:
姓名 年龄 学习时间
jack 12 6小时
rose 13 7小时
lily 14 5小时
mike 12 4小时
john 15 2小时
ruben 16 7小时
jason 11 8小时
kroos 14 3小时
2.看完结果我们发现,我们需要找到年龄小于十四岁且学习时间超过6小时的学生
from openpyxl import *
wb = load_workbook(r'C:Users86189Desktop学习时间记录表.xlsx')
sheets = wb.worksheets
sheet = sheets[0]
# 我们将把符合条件的学生名字假如列表
name_lis = []
# 起始行要时第二行,因为第一行为表头,不是数据
for row in sheet.iter_rows(min_row=2):
# 两个条件,第一个就时每一行的第二个单元格数据要小于14
# 第二个条件是每一行的第三个单元格在去除右边的”小时“两个字后值要大于6
if int(row[1].value) < 14 and int(row[2].value.rstrip('小时')) > 6:
# 如果满足条件则加入列表
name_lis.append(row[0].value)
# 输出名字列表
print(name_lis)
# 输出如下,可以参照上面的表格比对答案是否正确:
['rose', 'jason']
要注意,在实验我的代码时要更改文件的路径,因为在你的电脑上就不能用我的文件路径了
这一章讲解了sheet 和 cell 基本的读操作,下一章会讲解如何写,还有写入的样式等等