为了考核学员对 Python Workbook 和 load_workbook 模块学习掌握情况,将学生各科成绩表汇总生成一个新的学生总成绩表几乎成了必练作业或必考题,本文介绍两种方法,供学习参考。
一、原始数据
学生各科成绩表数据结构如下,有兴趣的读者可以采取选取复制粘贴的方法自己生成一个【学生各科成绩表.xlsx】,用于学习实践:
学号 | 姓名 | 语文 | 数学 | 英语 | 物理 | 化学 | 思品 | 历史 | 地理 | 生物 |
20230101 | 朱婴 | 94 | 117 | 116 | 58 | 36.5 | 28 | 33 | 27 | 22 |
20230102 | 赵朔 | 89 | 114 | 111 | 58 | 34.5 | 34 | 28 | 26 | 28 |
20230103 | 赵胜 | 91 | 113 | 111 | 59 | 36 | 37 | 28 | 24 | 20 |
20230104 | 赵嘉 | 98 | 101 | 113 | 47 | 31.5 | 32 | 34 | 26 | 26 |
20230105 | 赵成 | 100 | 105 | 110 | 56 | 35 | 20 | 35 | 22 | 23 |
20230106 | 展喜 | 90 | 109 | 113 | 58 | 32 | 21 | 30 | 26 | 23 |
20230107 | 袁克 | 86 | 110 | 108 | 53 | 36.5 | 29 | 29 | 26 | 23 |
20230108 | 杨朱 | 89 | 110 | 109 | 57 | 28 | 31 | 27 | 26 | 21 |
20230109 | 阎嘉 | 79 | 115 | 100 | 56 | 37.5 | 31 | 26 | 24 | 24 |
20230110 | 胥婴 | 88 | 95 | 112 | 59 | 34.5 | 26 | 23 | 25 | 26 |
20230111 | 向宁 | 82 | 109 | 84 | 57 | 33 | 27 | 29 | 28 | 27 |
20230112 | 伍举 | 83 | 108 | 101 | 47 | 35.5 | 23 | 21 | 25 | 26 |
20230113 | 王子胜 | 87 | 94 | 103 | 54 | 28 | 30 | 27 | 27 | 19 |
20230114 | 田盈 | 78 | 98 | 99 | 34 | 28 | 23 | 27 | 18 | 15 |
20230115 | 孙嘉 | 85 | 89 | 78 | 42 | 30.5 | 28 | 24 | 21 | 16 |
20230116 | 沈子嘉 | 82 | 93 | 74 | 39 | 29.5 | 26 | 16 | 26 | 22 |
20230117 | 沈尹寿 | 66 | 101 | 86 | 42 | 23.5 | 22 | 24 | 15 | 18 |
20230118 | 祁胜 | 80 | 72 | 97 | 32 | 16.5 | 26 | 26 | 22 | 14 |
20230119 | 栾盈 | 75 | 73 | 78 | 37 | 27.5 | 22 | 29 | 23 | 18 |
20230120 | 栾宁 | 76 | 81 | 93 | 33 | 17 | 21 | 22 | 19 | 13 |
20230121 | 李克 | 76 | 78 | 78 | 25 | 20 | 17 | 31 | 19 | 15 |
20230122 | 乐婴齐 | 76 | 78 | 70 | 37 | 29 | 21 | 26 | 8 | 13 |
20230123 | 乐大心 | 76 | 72 | 63 | 28 | 13.5 | 23 | 29 | 21 | 17 |
20230124 | 乐成 | 76 | 73 | 60 | 19 | 26.5 | 22 | 23 | 24 | 16 |
20230125 | 孔宁 | 77.5 | 67 | 69 | 14 | 14.5 | 18 | 27 | 22 | 18 |
20230126 | 贾举 | 70 | 66 | 57 | 21 | 20.5 | 14 | 26 | 15 | 11 |
20230127 | 韩虎 | 76 | 68 | 45 | 24 | 11 | 15 | 14 | 17 | 17 |
20230128 | 巩成 | 65 | 64 | 57 | 20 | 20.5 | 10 | 20 | 14 | 9 |
20230129 | 高克 | 75 | 42 | 54 | 20 | 12.5 | 21 | 14 | 8 | 9 |
20230130 | 高虎 | 67 | 43 | 39 | 24 | 21 | 26 | 17 | 9 | 9 |
20230131 | 范鞅 | 8 | 24 | 57 | 18 | 16.5 | 7 | 15 | 13 | 6 |
20230132 | 崔成 | 44 | 10 | 23 | 13 | 7 | 11 | 11 | 5 | 3 |
二、实现目标:
调用第三方库 openpyxl 的 Workbook 和 load_workbook 模块,处理 excel 文件取出各科成绩数据,相加后将总成绩数据存入【学生总成绩表.xlsx】中,结构如下表:
姓名 | 总分 |
朱婴 | 531.5 |
赵朔 | 522.5 |
赵胜 | 519 |
赵嘉 | 508.5 |
赵成 | 506 |
展喜 | 502 |
袁克 | 500.5 |
杨朱 | 498 |
阎嘉 | 492.5 |
胥婴 | 488.5 |
向宁 | 476 |
伍举 | 469.5 |
王子胜 | 469 |
田盈 | 420 |
孙嘉 | 413.5 |
沈子嘉 | 407.5 |
沈尹寿 | 397.5 |
祁胜 | 385.5 |
栾盈 | 382.5 |
栾宁 | 375 |
李克 | 359 |
乐婴齐 | 358 |
乐大心 | 342.5 |
乐成 | 339.5 |
孔宁 | 327 |
贾举 | 300.5 |
韩虎 | 287 |
巩成 | 279.5 |
高克 | 255.5 |
高虎 | 255 |
范鞅 | 164.5 |
崔成 | 127 |
三、程序代码:
方法一:
建立一个以姓名为键名、成绩合计为变量的学生分数合计字典,遍历添加到工作表。
#导入模块
from openpyxl import Workbook, load_workbook
#导入 excel 工作簿
wb = load_workbook('./学生各科成绩表.xlsx')
# 获取活动工作表
ws = wb.active
# 通过实例化 Workbook 类来获取工作簿对象,为创建【学生总成绩表】做准备
new_wb = Workbook()
# 获取活动工作表
new_ws = new_wb.active
# 计算每名学生的总分
data = {} # 初始化学生分数合计字典
# 获取活动工作表 ws 中除表头外的数据
for row in ws.iter_rows(min_row=2, values_only=True):
name = row[1] # 取出学生姓名
total = 0 # 初始化总分计算变量
classify = 0 # 初始化计算分类标识符
for n in row: # 遍历行数据
classify += 1
if classify >2: # 从第3列开始为学生的各科成绩
total += n # 累加各科成绩
elif classify == 2:# 如果是第2列数据
name = n # 取出学生姓名
data[name] = total # 将合计成绩赋值给对应学生姓名的键名
# 将表头写入工作表中
new_ws.append(['姓名','成绩'])
# 遍历学生分数合计字典,并将学生姓名和分数合计加入工作表中
for key in data:
row_data =[]
row_data.append(key)
row_data.append(data[key])
new_ws.append(row_data)
# 保存文件保存为【学生总成绩表.xlsx】
new_wb.save('./学生总成绩表.xlsx')
方法二:
用 sum() 函数直接对各科成绩求和,直接添加到工作表。
#导入模块
from openpyxl import Workbook, load_workbook
#导入 excel 工作簿
wb = load_workbook('./学生各科成绩表.xlsx')
# 获取活动工作表
ws = wb.active
# 通过实例化 Workbook 类来获取工作簿对象,为创建【学生总成绩表】做准备
new_wb = Workbook()
# 获取活动工作表
new_ws = new_wb.active
# 将表头写入工作表中
new_ws.append(['姓名','成绩'])
# 获取活动工作表 ws 中除表头和学号的数据
for row in ws.iter_rows(min_row=2, min_col=2, values_only=True):
name = row[0] # 获取学生姓名
total = sum(row[1:]) # 合计各科成绩
new_ws.append([name,total]) #将学生姓名和分数合计加入工作表中
# 保存文件保存为【学生总成绩表.xlsx】
new_wb.save('./学生总成绩表.xlsx')
分享完毕!欢迎交流!