01利用python从excel表格中提取未报名的学生名单

129 阅读2分钟

问题描述:表1是学生总数,表2是已报名的学生名单,需要结合表1和表2提取出未报名学生名单到表3中

图1是总学生数的数据结构

​编辑图2是已报学生数的数据结构

​编辑

实现代码如下:

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')

图3为提取未报名学生名单结果

总上所述,python在处理excel方面具有非常优秀的功能,可以根据实际业务流程需要进行精准定制exe执行文件,一键批理提取。有这方面需求的朋友欢迎交流和咨询。wx:X331752133 备注说明:X为大写