""" Excel文件处理工具 """ import pandas as pd from typing import List, Dict, Tuple from pathlib import Path def read_students_from_excel(file_path: str) -> List[Dict]: """ 从Excel文件读取学生信息 期望的Excel格式: - 第一行:表头(学号、姓名、专业) - 后续行:学生数据 返回:学生信息列表 """ try: df = pd.read_excel(file_path) # 标准化列名(支持多种可能的列名) column_mapping = { '学号': 'student_id', 'student_id': 'student_id', 'Student ID': 'student_id', '姓名': 'name', 'name': 'name', 'Name': 'name', '专业': 'major', 'major': 'major', 'Major': 'major' } # 重命名列 df.columns = df.columns.str.strip() for old_name, new_name in column_mapping.items(): if old_name in df.columns: df.rename(columns={old_name: new_name}, inplace=True) # 检查必需列 if 'student_id' not in df.columns or 'name' not in df.columns: raise ValueError("Excel文件必须包含'学号'和'姓名'列") # 转换为字典列表 students = [] for _, row in df.iterrows(): student = { 'student_id': str(row['student_id']).strip(), 'name': str(row['name']).strip(), 'major': str(row.get('major', '')).strip() if 'major' in df.columns else '' } # 过滤空行 if student['student_id'] and student['name']: students.append(student) return students except Exception as e: raise ValueError(f"读取Excel文件失败: {str(e)}") def export_scores_to_excel(students_data: List[Dict], output_path: str) -> bool: """ 导出积分详单到Excel文件 students_data: 包含学号、姓名、专业、随机点名次数、总积分的学生数据列表 output_path: 输出文件路径 """ try: df = pd.DataFrame(students_data) # 确保列顺序 columns_order = ['学号', '姓名', '专业', '随机点名次数', '总积分'] df = df.reindex(columns=columns_order) # 导出到Excel df.to_excel(output_path, index=False, engine='openpyxl') return True except Exception as e: raise ValueError(f"导出Excel文件失败: {str(e)}") def create_template_excel(output_path: str) -> bool: """ 创建Excel模板文件 """ try: template_data = { '学号': ['2021001', '2021002', '2021003'], '姓名': ['张三', '李四', '王五'], '专业': ['软件工程', '计算机科学', '数据科学'] } df = pd.DataFrame(template_data) df.to_excel(output_path, index=False, engine='openpyxl') return True except Exception as e: raise ValueError(f"创建模板文件失败: {str(e)}")