python openpyxl处理Excel成绩表自动统计 python openpyxl处理Excel成绩表自动统计 本文用Python openpyxl批量处理 Excel 成绩表自动算平均分、排名含完整可运行代码。场景说明上周帮学妹处理课程设计她对着300多人的Excel成绩表发愁——要算每个学生的平均分还要按总分排名最后输出一张整洁的成绩单。手动算光是复制粘贴就能干到凌晨。我给她写了个Python脚本20秒搞定所有计算还自动生成了排名。今天把这个脚本分享出来复制代码、改个文件路径就能用。你直接能获得- 一个完整可运行的Python脚本40行- 示例Excel数据生成代码不用找测试文件- 常见报错排查步骤空值、列名不对等- 修改参数就能适配你的表格如按科目分组排名适用场景老师发的成绩表、实验报告汇总、课程设计数据处理完整脚本复制即用import pandas as pd import os # 配置区 INPUT_FILE 学生成绩表.xlsx # 输入文件名放在脚本同目录下 OUTPUT_FILE 成绩统计结果.xlsx # 输出文件名 SHEET_NAME Sheet1 # 工作表名 SCORE_COLUMNS [语文, 数学, 英语, 物理, 化学] # 成绩列名按实际修改 STUDENT_ID_COL 学号 # 学号列名 STUDENT_NAME_COL 姓名 # 姓名列名 # def process_scores(): 处理成绩表计算平均分、总分、排名 # 1. 读取Excel if not os.path.exists(INPUT_FILE): print(f❌ 错误找不到文件 {INPUT_FILE}) print(请确保文件在脚本同目录下或修改INPUT_FILE路径) return df pd.read_excel(INPUT_FILE, sheet_nameSHEET_NAME) print(f✅ 成功读取文件共 {len(df)} 行数据) # 2. 检查列名是否存在 required_cols [STUDENT_ID_COL, STUDENT_NAME_COL] SCORE_COLUMNS missing_cols [col for col in required_cols if col not in df.columns] if missing_cols: print(f❌ 错误缺少以下列{missing_cols}) print(f当前表格列名{list(df.columns)}) return # 3. 处理空值将空成绩视为0分 original_count len(df) df[SCORE_COLUMNS] df[SCORE_COLUMNS].fillna(0) null_count df[SCORE_COLUMNS].isnull().sum().sum() if null_count 0: print(f⚠️ 警告发现 {null_count} 个空值已自动填充为0) # 4. 计算总分和平均分 df[总分] df[SCORE_COLUMNS].sum(axis1) df[平均分] df[SCORE_COLUMNS].mean(axis1).round(2) # 保留两位小数 # 5. 按总分排名降序 df[排名] df[总分].rank(ascendingFalse, methodmin).astype(int) # 6. 按排名排序 df_sorted df.sort_values(排名) # 7. 保存结果 output_cols [STUDENT_ID_COL, STUDENT_NAME_COL, 排名, 总分, 平均分] SCORE_COLUMNS df_sorted[output_cols].to_excel(OUTPUT_FILE, indexFalse) print(f✅ 处理完成结果已保存到{OUTPUT_FILE}) print(f 数据概览最高分 {df[总分].max()}最低分 {df[总分].min()}平均分 {df[总分].mean():.2f}) # 运行主程序 if __name__ __main__: process_scores()使用步骤5分钟上手第一步安装依赖打开命令行WinR输入cmd运行pip install pandas openpyxl第二步准备Excel文件把成绩表保存为学生成绩表.xlsx放在脚本同目录下。表结构示例| 学号 | 姓名 | 语文 | 数学 | 英语 | 物理 | 化学 ||------|------|------|------|------|------|------|| 001 | 张三 | 85 | 92 | 78 | 88 | 90 || 002 | 李四 | 76 | 88 | 95 | 82 | 79 |如果不想找测试文件运行下面这段代码会自动生成示例数据import pandas as pd import numpy as np data { 学号: [f{i:03d} for i in range(1, 11)], 姓名: [f学生{i} for i in range(1, 11)], 语文: np.random.randint(60, 100, 10), 数学: np.random.randint(60, 100, 10), 英语: np.random.randint(60, 100, 10), 物理: np.random.randint(60, 100, 10), 化学: np.random.randint(60, 100, 10) } df pd.DataFrame(data) df.to_excel(学生成绩表.xlsx, indexFalse) print(✅ 示例数据已生成)第三步修改配置区打开脚本找到配置区根据你的表格修改-SCORE_COLUMNS改成你表格里成绩列的列名如[高数, 线代, 概率论]-STUDENT_ID_COL和STUDENT_NAME_COL改成学号和姓名列名第四步运行脚本python 成绩处理脚本.py输出效果✅ 成功读取文件共 10 行数据 ✅ 处理完成结果已保存到成绩统计结果.xlsx 数据概览最高分 468最低分 352平均分 410.50常见坑排查指南坑1报错 No module named pandas原因没安装依赖库解决运行pip install pandas openpyxl坑2报错 FileNotFoundError原因Excel文件不在脚本同目录下或文件名写错解决- 检查文件名大小写成绩表.xlsx≠成绩表.XLSX- 或者用绝对路径INPUT_FILE D:/data/成绩表.xlsx坑3报错 KeyError: 语文原因表格里没有你写的列名解决- 先用Excel打开文件确认列名完全一致注意空格- 打印当前列名在脚本第20行后加print(list(df.columns))坑4成绩列有文本如缺考原因pandas无法对文本算平均分解决修改脚本在计算前把文本转成数字df[SCORE_COLUMNS] df[SCORE_COLUMNS].apply(pd.to_numeric, errorscoerce).fillna(0)可改参数适配其他场景场景1按科目分组排名如理科班、文科班修改配置区添加分组列GROUP_COL 班级 # 新增在排名前加一句df[排名] df.groupby(GROUP_COL)[总分].rank(ascendingFalse, methodmin).astype(int)场景2只算部分科目如只算三门主科修改SCORE_COLUMNSSCORE_COLUMNS [语文, 数学, 英语] # 只算这三科场景3输出带百分比的成绩单在保存前加一列total_score len(SCORE_COLUMNS) * 100 df[得分率] (df[总分] / total_score * 100).round(1).astype(str) %场景4跳过空值不填充为0把第27行的fillna(0)改成df df.dropna(subsetSCORE_COLUMNS) # 直接删除有缺失的行总结这个脚本我用了两年从课程设计到帮老师处理期末成绩从没翻过车。核心思路就是改路径就能跑你只需要1. 装好pandas2. 改对列名3. 双击运行额外提醒这种批量处理Excel的技能在校园里特别实用——帮导师整理实验数据、帮社团做活动统计甚至接个几十块钱的小单子帮同学处理成绩表都是顺手的事。但记住代码能力才是根本别为了接单耽误学习。有什么问题评论区留言看到必回。记得先跑通示例数据再套用你自己的表格。