一、基础知识
1.安装
openpyxl是用来处理Excel电子表格的Python第三方库,使用前需要现安装,pip install openpyxl
2.新建工作簿
from openpyxl import Workbook
# 新建工作簿
new_wb = Workbook()
# 将新建的工作簿保存为【新的Excel工作表.xlsx】
new_wb.save('./新的Excel工作表.xlsx')
3.读取工作簿
openpyxl.load_workbook()
可读取工作簿对象。- **工作簿对象[‘工作表’]**可读取工作表。
- **工作表对象[行数]、工作表对象[‘列名’]**可读取行和列,得到一个元祖。
- **工作表对象[行列]**得到一个单元格对象
Cell
。 - 单元格对象.value得到这个单元格对象具体的值。
from openpyxl import load_workbook # 打开【21计3成绩表.xlsx】工作簿 wb = load_workbook('./Python成绩表.xlsx') # 获取【'21计3'】工作表 ws_21J3 = wb['21计3'] # 循环打印出第2行所有单元格的值 for cell_2 in ws_21J3[2]: print(cell_2.value) # 循环打印出第2列(B列)所有单元格的值 for cell_B in ws_21J3['B']: print(cell_B.value) # 打印出B1单元格的值 print(ws_21J3['B1'].value)
- 工作表对象还有
iter_rows()
方法,可以获得表中指定范围的数据。 - 参数
min_row
和max_row
分别表示最小行索引和最大行索引,参数min_col
和max_col
分别表示最小列索引和最大列索引。最小行索的值默认为1,最大索引的值默认为表格中有数据的最下面一行的行数。 - 参数
values_only
决定是否返回单元格的值,如果为True则返回单元格的值,如果为False则返回单元格对象。
from openpyxl import load_workbook
# 打开【21计3成绩表.xlsx】工作簿
wb = load_workbook('./Python成绩表.xlsx')
# 获取【'21计3'】工作表
ws_21J3 = wb['21计3']
# 返回第2行至第12行,第2列(B列)至第3列(C列)这个范围的单元格内的所有数据
for row in ws_21J3.iter_rows(min_row=2, max_row=4, min_col=2, max_col=3, values_only=True):
print(row)
4.添加数据
from openpyxl import load_workbook
# 打开【21计3成绩表.xlsx】工作簿
wb = load_workbook('./Python成绩表.xlsx')
# 获取【'21计3'】工作表
ws_21J3 = wb['21计3']
# 添加数据只能是列表和元祖类型
ws_21J3.append(['31','新同学','男','55'])
# 添加完成后必须保存
wb.save('./Python成绩表.xlsx')
注意,如果要保存文件,别把工作簿打开,会报错。
二、制作查询功能
查询可以用字典的键值对来实现。
from openpyxl import load_workbook
# 打开【21计3成绩表.xlsx】工作簿
wb = load_workbook('./Python成绩表.xlsx')
# 获取【'21计3'】工作表
ws_21J3 = wb['21计3']
# 创建学生信息字典
student_info = {}
# 从第二行开始读取工作表中的信息
for row in ws_21J3.iter_rows(min_row=2, values_only=True):
# 取出学号
student_number = row[0]
# 将信息存入学生信息字典
student_info[student_number] = {
'学号':row[0],
'姓名':row[1],
'性别':row[2],
'成绩':row[3],
}
print(student_info)
print(student_info[16]['姓名'])
完善一下交互体验吧。
from openpyxl import load_workbook
# 打开【21计3成绩表.xlsx】工作簿
wb = load_workbook('./Python成绩表.xlsx')
# 获取【'21计3'】工作表
ws_21J3 = wb['21计3']
# 创建学生信息字典
students_info = {}
# 从第二行开始读取工作表中的信息
for row in ws_21J3.iter_rows(min_row=2, values_only=True):
# 取出学号
student_number = row[0]
# 将信息存入学生信息字典
students_info[student_number] = {
'学号':row[0],
'姓名':row[1],
'性别':row[2],
'成绩':row[3],
}
while True:
try:
# 输入你想查询的员工的工号
student_number = int(input('请输出你想要查询的学号:'))
except:
print('请输入数字啊!!!')
continue
try:
# 根据学号(键)找到学生信息(值)
student_info = students_info[student_number]
except:
print('数据表中没有这个学号')
continue
search_info = input('请输出你想查询的信息(如:姓名/性别/成绩):')
# 判断该员工信息是否存在
if student_info.get(search_info):# dict.get()返回指定键的值,如果键不在字典中返回默认值 None 或者设置的默认值。
print(f'经查询,该学生的{search_info}为{student_info[search_info]}')
else:
print('输入错误,只能查询姓名/性别/成绩')
三、筛选迟到同学信息
现需要筛选出迟到时间超过50分钟,并且迟到次数超过3次的同学,并将信息写入一张新的表格。
from openpyxl import load_workbook,Workbook
# 打开【21计3成绩表.xlsx】工作簿
wb = load_workbook('./Python成绩表.xlsx')
# 获取【'21计3'】工作表
ws_21J3 = wb['21计3']
#获得表头
header = []
for row in ws_21J3[1]:
header.append(row.value)
# 新建工作簿,存储迟到人员信息
new_wb = Workbook()
new_ws = new_wb.active # 获得活动工作表(第一张表)
# 先写入表头
new_ws.append(header)
# 从第二行开始依次读取
for row in ws_21J3.iter_rows(min_row=2,values_only=True):
name = row[1]
late_time = row[4]
late_number = row[5]
if late_time > 50 and late_number > 3:
print(f"{name}迟到了{late_time}分钟,迟到了{late_number}次。")
new_ws.append(row) # 将迟到人员的信息写入新表
# 保存文件
new_wb.save('./迟到同学信息.xlsx')
四、找出悄悄改成绩的同学
在录入成绩之前,有同学趁办公室没人,悄悄修改了自己的成绩,为预防这种情况,成绩单还留了一份旧表,现需要对比两张表格,找出那个悄悄改成绩的同学。
from openpyxl import load_workbook,Workbook
# 打开原来的工作簿、工作表
old_wb = load_workbook('./Python成绩表.xlsx')
old_ws = old_wb['21计3']
# 将旧表的信息做成一个字典,字典格式为{姓名:成绩}
score_dict = {}
for row in old_ws.iter_rows(min_row=2,values_only=True):
score_dict[row[1]] = row[3]
# 打开被改动之后工作簿、工作表
new_wb = load_workbook('./Python成绩表(被悄悄改动过).xlsx')
new_ws = new_wb['21计3']
# 将新表中的数据一行行的拿出来对比
for row in new_ws.iter_rows(min_row=2,values_only=True):
name = row[1]
score = row[3]
if score != score_dict[name]:
print(f"{name}的成绩不对,和旧表匹配不上")