模块的介绍和安装
Python专栏中有对所有可以操作Excel的模块进行了对比分析,感兴趣的同学可以前去围观。
推荐阅读:Python*死Excel?众多模块哪家强
openpyxl模块是一个可以读取和写入Excel文件的模块,可以处理Excel数据、公式、样式,在表格里面插入图表等;需要单独安装不包含在python标准库里;
安装:pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple
在windows系统下使用此条指令进行第三方库的安装省时间,Mac端直接使用pip3 install 模块名
具体openpyxl的官方文档可以参照https://openpyxl.readthedocs.io/en/stable/
Excel表格术语
列:column,以字母表示,在表格的上方
行:row,以数字表示,但是注意这里是从1开始,在表格的左侧
表单:sheet,在表格的下部
读数据
打开Excel表格并获取表格名称下面读取表格的整体思路就是:
- 读取一个表格
- 获取里面的某个sheet
- 获取sheet中单元格、某行、某列的数据
- 获取指定范围的行列数据
- 案例:查找有空值的单元格
load_workbook(filename = 表格文件路径);workbook.sheetnames 获取表格文件内的sheet名称
注意:只能打开存在的表格,不能用该方法创建一个新表格文件
我们通过读取丝芙兰的售卖商品来学习Excel操作,内容如下:
from openpyxl import load_workbook
workbook = load_workbook(filename= 'cosmetics.xlsx')
print(workbook.sheetnames)
可以看到有:
['cosmetics', 'Sheet1', 'Sheet2']
那么我们就可以通过sheetname获取表格,但是如果Excel中只有一个sheet,那么可以直接使用.active
sheet = workbook['cosmetics'] # 返回的是workbook对象:<Worksheet "cosmetics">
但是我们的workbook是有多个sheet的,active的使用如下:
sheet = workbook.active
获得Excel里面的sheet之后就可以对表格的数据进行操作。比如:获取表格的尺寸大小;第一行第一列的数据,代码如下:
print(sheet.dimensions) # 获取的表格的范围:A1:K1473
cell = sheet['B1']
print(cell.value) # 获取B1表格的数据,结果:Brand
获取某一行或者某一列的内容
col_content = sheet['B'] # 表示获取B这一列
row_content = sheet[3] #获取第3行数据
print(row_content)
注意返回的Cell单元格对象
(<Cell 'cosmetics'.A3>, <Cell 'cosmetics'.B3>, <Cell 'cosmetics'.C3>, <Cell 'cosmetics'.D3>, <Cell 'cosmetics'.E3>, <Cell 'cosmetics'.F3>, <Cell 'cosmetics'.G3>, <Cell 'cosmetics'.H3>, <Cell 'cosmetics'.I3>, <Cell 'cosmetics'.J3>, <Cell 'cosmetics'.K3>)
如果想获取每个里面的值,可以结合value属性
# 接上代码
for row in row_content:
print(row.value)
获取多行或者多列内容
.iter_rows(min_row = 最低行数,max_row = 最高行数,min_col = 最低列数,max_col = 最高列数) 按行获取
.iter_cols(min_row = 最低行数,max_row = 最高行数,min_col = 最低列数,max_col = 最高列数) 按列获取
注意:这两个演示任一个都可以,两个案例的区别就是第一个是每次获取一行内容,第二个是按照列获取内容。
每次获取一行数据
for row in sheet.iter_rows(min_row=2, max_row=5, min_col= 1,max_col=4): # 涵盖范围的所有单元格都会显示
# print(row) # 每行的内容是一个元组的内容,如果想看到数据还需要继续遍历
for cell in row:
print(cell.value)
print('-'*50)
结果:
这个获取的内容有点类似使用pandas的loc获取第几行几列的情况。
同样列的获取也是一样道理,就是每次获取一列数据
for col in sheet.iter_cols(min_row=2, max_row=5, min_col= 1,max_col=4):
print(col)
for cell in row:
print(cell.value)
print('-'*50)
结果: