可以读取和写入Excel文件;需要单独安装;不包含在python标准库里;可以处理Excel数据、公式、样式,在表格里面插入图表等
pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple
在windows系统下使用此条指令进行第三方库的安装省时间,Mac端直接使用pip3 install 模块名
列: column,以字母表示,在表格的上方
行: row,以数字表示,但是注意这里是从1开始,在表格的左侧
表单: sheet,在表格的下部
load_workbook(filename = 表格文件路径);workbook.sheetnames 获取表格文件内的sheet名称
注意:只能打开存在的表格,不能用该方法创建一个新表格文件
import os
os.chdir('C:\\Users\\86177\\Desktop')
from openpyxl import load_workbook
workbook = load_workbook(filename= '阿里云天池电商婴儿用户数据.xlsx')
print(workbook.sheetnames)
–> 输出结果为:[’(sample)sam_tianchi_mum_baby_tr’]
workbook[sheet名称]
sheet = workbook['(sample)sam_tianchi_mum_baby_tr']
获得Excel里面的sheet之后就可以对表格的数据进行操作。比如:获取表格的尺寸大小;第一行第一列的数据,代码如下
print(sheet.dimensions)
cell = sheet['A1']
print(cell.value)
–> 输出结果为:
A1:G1002
user_id
如果只有Excel中只有一个sheet,那么可以直接使用.active
sheet = workbook.active
cell = sheet['B5']
print(cell.value)
–> 输出结果为:12515996043
.row/.column/.coordinate
cell = sheet['A1']
print(cell.row, cell.column, cell.coordinate)
–> 输出结果为:1 1 A1
sheet.cell(row = 行数, column = 列数)
cell = sheet.cell(row = 1, column = 1)
print(cell.row, cell.column, cell.coordinate)
–> 输出结果为:1 1 A1
比如:sheet[‘A’]/sheet[5],字符就是列,数字就是行
cell1 = sheet['A']
cell2 = sheet[2]
print(cell1, cell2)
.iter_rows(min_row = 最低行数,max_row = 最高行数,min_col = 最低列数,max_col = 最高列数)
for row in sheet.iter_rows(min_row=2, max_row=3, min_col= 1,max_col=2):
print(row)
–> 输出结果为:
(
(
.iter_cols(min_row = 最低行数,max_row = 最高行数,min_col = 最低列数,max_col = 最高列数)
for col in sheet.iter_cols(min_row=2, max_row=3, min_col= 1,max_col=2):
print(col)
–> 输出结果为:
(
(
.rows
for row in sheet.rows:
print(row)
.columns
for col in sheet.columns:
print(col)
注意这里和上面的区别,迭代全部的行和列的字符都是全拼,但是行的复数单词的rows,所以简写,全拼是一样的
编写一个python程序,要求:
(1)打开文件阿里云天池电商婴儿用户数据.xlsx
(2)找到其中空的格子
(3)输出这些格子的坐标,如A1,C10
先查看数据的尺寸大小,空格子(缺失数据)自然要在数据的尺寸大小之中,如果超出这个范围那就全是空格子了,没有研究意义,所以只考虑的是数据尺寸大小内的空格子
参考代码答案如下:
import os
os.chdir('C:\\Users\\86177\\Desktop')
from openpyxl import load_workbook
workbook = load_workbook(filename= '阿里云天池电商婴儿用户数据.xlsx')
sheet = workbook.active
data_size = sheet.dimensions
print(data_size)
–> 输出结果为 A1:G1002
思路:借鉴 cell = sheet[‘B5’] ,print(cell.value),也就是通过字符和数字的组合来遍历表中的全部数据,然后再判断是否为空值,随后返回对应的格子坐标。需要确定数据遍历的起始和终止位置
size_ls = data_size.split(":")
col_min,row_min,col_max,row_max = size_ls[0][0],size_ls[0][1],size_ls[1][0],size_ls[1][1:]
print(col_min,row_min,col_max,row_max)
–> 输出结果为:A 1 G 1002
根据上面有关于Excel相关术语可知,列的标签是A-G,行的标签是1-1002,实现行的遍历很简单,但是实现字符A-G的遍历就需要一点功夫,这里需要知道一个知识点(英文字符和数字的转换的问题)
ord(字符) 该方法是将字符转化为数字,比如print(ord(‘A’)) --> 输出结果为65
chr(数字) 该方就是将数字转化为字符,比如print(chr(65)) --> 输出结果为A
ls = []
for i in range(65,72):
ls.append(chr(i))
print(ls)
ls = [chr(x) for x in range(65,72)]
print(ls)
–> 输出结果都为:[‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’]
lt = []
for i in ls:
lt.append(ord(i))
print(lt)
–> 输出结果都为:[65, 66, 67, 68, 69, 70, 71]
none_ls = []
for col in range(ord(col_min),ord(col_max)+1):
for row in range(int(row_min), int(row_max)+1):
if sheet[chr(col)+str(row)].value == None:
#print(chr(col)+str(row))
none_ls.append(chr(col)+str(row))
for i in none_ls:
print(i, end=" ")
print("\n\nfinished!")
–> 输出结果都为:A278 A610 A1002 B342 B527 B958 B1002 C320 C590 C1002 D1002 E153 E278 E293 E503 E544 E666 E791 E816 E916 E1002 F554 F611 G339 G597 G976 G1002