问题描述:表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为大写