内容简介
在教育机构或学校管理中,经常需要从大量学生信息中筛选出未报名参加特定活动或考试的学生名单。这个过程通常涉及繁琐的手动操作,如对比学生总名单和已报名名单,查找缺失的记录。本文介绍的Python脚本旨在自动化这一过程,通过读取和处理Excel电子表格来识别并列出未报名的学生。该脚本利用openpyxl
库操作Excel文件,从一个包含所有学生信息的工作表中提取数据,与已报名学生的工作表进行对比,然后将未报名学生的信息输出到一个新的工作表中。最后,脚本还会调整新工作表的列宽以适应内容,并保存更新后的工作簿。这个过程不仅节省了时间,还减少了人为错误,提高了数据处理的效率和准确性。
分步骤解说代码
步骤1:导入必要的库
import openpyxl
from copy import copy
首先,我们导入openpyxl
库来处理Excel文件,以及copy
函数用于复制样式。
步骤2:加载工作簿和工作表
info_wb = openpyxl.load_workbook('报考信息.xlsx')
info_ws = info_wb['总学生数']
apply_ws = info_wb['已报名学生']
这里,我们加载了一个名为“报考信息.xlsx”的工作簿,并从中获取了两个工作表:“总学生数”和“已报名学生”。
步骤3:创建新的工作表
unapplied_ws = info_wb.create_sheet('未报考学生名单')
我们创建一个新的工作表,命名为“未报考学生名单”,用于存储未报考的学生信息。
步骤4:提取学生信息表中的数据
info_data = []
for row in info_ws.iter_rows(min_row=2, values_only=True):
info_data.append(row)
从“总学生数”工作表中提取所有行的数据(跳过标题行),并存储在info_data
列表中。
步骤5:提取报考表中的数据,并创建一个集合用于快速查找
apply_data = set()
for row in apply_ws.iter_rows(min_row=2, values_only=True):
apply_data.add((row[0], row[1], row[2]))
从“已报名学生”工作表中提取姓名、身份证号和现班级的信息,并存储在一个集合apply_data
中,以便于快速查找。
步骤6:找出未报考的学生
unapplied_students = [student for student in info_data if (student[0], student[1], student[2]) not in apply_data]
使用列表推导式找出在“总学生数”中但不在“已报名学生”中的学生的记录。
步骤7:用原来的表头作为新表头,并复制格式
header_row = info_ws[1]
for cell in header_row:
new_cell = unapplied_ws.cell(row=1, column=cell.column)
new_cell.value = cell.value
if cell.has_style:
new_cell._style = copy(cell._style)
复制“总学生数”工作表的表头到新工作表,并复制格式。
步骤8:从第2行开始写入未报考学生数据,并保持格式
for idx, student in enumerate(unapplied_students, start=2):
for col_idx, value in enumerate(student, start=1):
new_cell = unapplied_ws.cell(row=idx, column=col_idx)
new_cell.value = value
original_cell = info_ws.cell(row=idx + 1, column=col_idx)
if original_cell.has_style:
new_cell._style = copy(original_cell._style)
将未报考学生的数据写入新工作表,并复制相应的单元格格式。
步骤9:自动调整列宽
for col in unapplied_ws.columns:
max_length = 0
column = col[0].column_letter
for cell in col:
try:
if len(str(cell.value)) > max_length:
max_length = len(cell.value)
except:
pass
adjusted_width = (max_length + 2) * 1.2
unapplied_ws.column_dimensions[column].width = adjusted_width
遍历每一列,计算最大单元格内容长度,并据此调整列宽。
步骤10:保存工作簿
info_wb.save('未报考学生名单.xlsx')
保存更新后的工作簿为“未报考学生名单.xlsx”。
完整代码
import openpyxl
from copy import copy
# 加载工作簿和工作表
info_wb = openpyxl.load_workbook('报考信息.xlsx')
info_ws = info_wb['总学生数'] # 假设学生信息表的工作表名为“总学生数”
apply_ws = info_wb['已报名学生'] # 假设报考表的工作表名为“已报名学生”
# 创建新的工作表
unapplied_ws = info_wb.create_sheet('未报考学生名单')
# 提取学生信息表中的数据
info_data = []
for row in info_ws.iter_rows(min_row=2, values_only=True): # 假设第一行是标题行,从第二行开始读取
info_data.append(row)
# 提取报考表中的数据,并创建一个集合用于快速查找
apply_data = set()
for row in apply_ws.iter_rows(min_row=2, values_only=True):
apply_data.add((row[0], row[1], row[2])) # 假设姓名、身份证号和现班级分别是第1、2、3列
# 找出未报考的学生
unapplied_students = [student for student in info_data if (student[0], student[1], student[2]) not in apply_data]
# 用原来的表头作为新表头,并复制格式
header_row = info_ws[1]
for cell in header_row:
new_cell = unapplied_ws.cell(row=1, column=cell.column)
new_cell.value = cell.value
if cell.has_style:
new_cell._style = copy(cell._style)
# 从第2行开始写入未报考学生数据,并保持格式
for idx, student in enumerate(unapplied_students, start=2):
for col_idx, value in enumerate(student, start=1):
new_cell = unapplied_ws.cell(row=idx, column=col_idx)
new_cell.value = value
original_cell = info_ws.cell(row=idx + 1, column=col_idx)
if original_cell.has_style:
new_cell._style = copy(original_cell._style)
# 自动调整列宽
for col in unapplied_ws.columns:
max_length = 0
column = col[0].column_letter # 获取列字母
for cell in col:
try:
if len(str(cell.value)) > max_length:
max_length = len(cell.value)
except:
pass
adjusted_width = (max_length + 2) * 1.2 # 稍微增加一点空间
unapplied_ws.column_dimensions[column].width = adjusted_width
# 保存工作簿
info_wb.save('未报考学生名单.xlsx')
这段代码通过分步骤解说,帮助理解如何使用Python和openpyxl
库来处理Excel文件,自动生成未报考学生名单,并保存更新后的工作簿。