实验目的: (1)了解扩展库openpyxl的安装与使用。 (2)了解使用扩展库openpyxl操作Excel文件的方法。 (3)熟练运用字典结构解决实际问题。 实验内容: 假设某学校所有课程每学期允许多次考试,学生可随时参加考试,系统自动将每次成绩添加到Excel文件(包含3列:姓名,课程,成绩)中,现期末要求统计所有学生每门课程的最高成绩。 编写程序,模拟生成若干同学的成绩并写入Excel文件,其中学生姓名和课程名称均可重复,也就是允许出现同一门课程的多次成绩,最后统计所有学生每门课程的最高成绩,并写入新的Excel文件。 代码实现: from random import choice, randint from openpyxl import Workbook, load_workbook # 生成随机数据 def generateRandomInformation(filename): workbook = Workbook() worksheet = workbook.worksheets[0] worksheet.append(['姓名','课程','成绩']) # 中文名字中的第一、第二、第三个字 first = '赵钱孙李' middle = '伟昀琛东' last = '坤艳志' subjects = ('语文','数学','英语') for i in range(200): name = choice(first) # 按一定概率生成只有两个字的中文名字 if randint(1,100)>50: name = name + choice(middle) name = name + choice(last) # 依次生成姓名、课程名称和成绩 worksheet.append([name, choice(subjects), randint(0, 100)]) # 保存数据,生成Excel 2007格式的文件 workbook.save(filename) def getResult(oldfile, newfile): # 用于存放结果数据的字典 result = dict() # 打开原始数据 workbook = load_workbook(oldfile) worksheet = workbook.worksheets[0] # 遍历原始数据 for row in worksheet.rows: if row[0].value == '姓名': continue # 姓名,课程名称,本次成绩 name, subject, grade = map(lambda cell:cell.value, row) # 获取当前姓名对应的课程名称和成绩信息 # 如果result字典中不包含,则返回空字典 t = result.get(name, {}) # 获取当前学生当前课程的成绩,若不存在,返回0 f = t.get(subject, 0) # 只保留该学生该课程的最高成绩 if grade > f: t[subject] = grade result[name] = t workbook1 = Workbook() worksheet1 = workbook1.worksheets[0] worksheet1.append(['姓名','课程','成绩']) # 将result字典中的结果数据写入Excel文件 for name, t in result.items(): print(name, t) for subject, grade in t.items(): worksheet1.append([name, subject, grade]) workbook1.save(newfile) if __name__ == '__main__': oldfile = r'd:\test.xlsx' newfile = r'd:\result.xlsx' generateRandomInformation(oldfile) getResult(oldfile, newfile) 结果:  |