【问题描述】
扩展ClassManager班级信息管理类,使之能将班级信息保存到“学生信息.xlsx”中,并能从这个文件读取班级信息。学生信息如下所示:
输出结果:
输出结果如图7-2-2所示。
图7-2-2“学生信息.xlsx”文件内容截图
【题前思考】
根据问题描述,填写表7-2-4。
表7-2-4 问题分析
【解题思路】
本活动和活动一的操作流程完全相同,不同的是调用了openpyxl模块中的功能,源程序仍然包含3个方面的内容:
一是导入模块文件。程序需要os模块和openpyxl模块中的Workbook类、load_workbook( )函数,以及a6_1_2班级管理类模块中ClassManager,因此需要导入这3个模块中的内容。
二是定义一个类ClassManager_excel,实现从Excel文件读写班级信息的功能。
三是创建ClassManager_excel类对象,添加学生信息,写入Excel文件,然后将Excel文件的信息读出至对象cls2并显示到显示器上。
【程序代码】
【代码分析】
①:openpyxl模块是专门处理Excel的工具,不仅能够读取和修改Excel文档,而且可以对Excel文件内单元格进行详细设置,包括单元格样式等内容,甚至还支持插入图表、打印设置等内容,使用openpyxl可以读写xltm、xltx、xlsm、xlsx等类型的文件,而且可以处理数据量较大的Excel文件。在本活动中,只使用其中的Workbook类和load_workbook( )函数。
②:创建Workbook类对象,并将其赋给workbook。Workbook类对象对应Excel中的工作簿。
③:workbook.create_sheet('学生信息')是在工作簿中创建名为“学生信息”的工作表(见图7-2-3),将工作表对象赋值给变量sheet1。注意工作表名“学生信息”是显示在Excel工作簿中的名称,sheet1是工作表对象的名称,用于编写程序时访问工作表。
④:将“班级名称”self.clsname赋给“学生信息”表中的第1行第1列,sheet1.cell(1,1)表示工作表第1行第1列的单元格,而sheet1.cell(1,1).value表示这个单元格的值,行列计数从1开始。写入班级信息之后的效果如图7-2-4所示。
图7-2-3 创建的“学生信息”工作表
图7-2-4“学生信息”工作表的第1行信息
⑤:enumerate(['学号','姓名','性别'],start=1)将列表['学号','姓名','性别']中的每一个值,与序号一起形成一个元组,最后返回一个元组的列表,start=1表示序号从1开始。这个函数调用的结果为[(1,'学号')(2,'姓名')(3,'性别')],用于将列标题写入对应的单元格,其中的序号表示这个列标题的列序号。sheet1.cell(2,i).value=name再将name赋给第二行对应i的单元格。结果如图7-2-5所示。
⑥:从第3行开始写入学生信息,sheet1.cell(i,1).value=s.sno将学号赋给第i行第1列单元格;sheet1.cell(i,2).value=s.name将姓名赋给第i行第2列单元格;sheet1.cell(i,3).value=s.sex将性别赋给第i行第3列单元格;这样就完成了学生信息的赋值。完成效果如图7-2-6所示。
图7-2-5 创建表头及标题行
图7-2-6 “学生信息”工作表的信息
⑦:workbook.active=1将第1个工作表(“学生信息”工作表)设置为活动工作表。workbook.save(path)将数据保存到路径path指定的Excel文件。
⑧:load_workbook(path)["学生信息"]打开参数path指定的工作簿,取得这个工作簿的"学生信息"工作表赋值给变量ws。
⑨:对工作表的所有行ws.rows中的每一行r执行列表推导式[a.valuefor a inr],这个列表推导式对r中的每一个单元格a,取出单元格的值构成列表。从列表推导式可以看出,这是一个嵌套列表,列表中的项又是一个列表,外层列表的项代表一行,内层列表的项代表这一行的每一个单元格的值。列表x的值如下:
⑩:以第1行第1列(班级名称)和第2列(班主任)的值为参数创建ClassManager_excel类对象students。
:从第2行开始对每一行s,以s[0](学号),s[1](姓名),s[2](性别)为参数将学生信息添加到students对象中。列表第0行是班级信息,第1行是列标题,从第2行开始才是学生信息。这样就将Excel文件中的所有信息完全恢复到班级信息管理对象students中了。
:调用cls.to_excel( )方法将班级信息管理类对象cls保存到Excel文件中。
:调用ClassManager_excel 类的load_excel( )方法打开指定的Excel表,创建cls2对象。接下来的语句cls2.show( )显示cls2对象中的班级信息,可以看出从Excel文件中读出的信息与原始信息相同。
【技术全貌】
openpyxl是Python处理Excel文件的模块,其中提供了很多有用的类和函数用于处理Excel表格,表7-2-5列出了部分内容。
表7-2-5 openpyxl的常用方法
续表