为了考核学员对 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')

分享完毕!欢迎交流!