python openpyxl处理Excel成绩表自动统计
> 本文用 Python openpyxl 批量处理 Excel 成绩表,自动算平均分、排名,含完整可运行代码。
场景说明
上周帮学妹处理课程设计,她对着300多人的Excel成绩表发愁------要算每个学生的平均分,还要按总分排名,最后输出一张整洁的成绩单。手动算?光是复制粘贴就能干到凌晨。我给她写了个Python脚本,20秒搞定所有计算,还自动生成了排名。今天把这个脚本分享出来,复制代码、改个文件路径就能用。
你直接能获得:
-
一个完整可运行的Python脚本(40行)
-
示例Excel数据生成代码(不用找测试文件)
-
常见报错排查步骤(空值、列名不对等)
-
修改参数就能适配你的表格(如按科目分组排名)
适用场景: 老师发的成绩表、实验报告汇总、课程设计数据处理
完整脚本(复制即用)
python
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_name=SHEET_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(axis=1)
df['平均分'] = df[SCORE_COLUMNS].mean(axis=1).round(2)
# 保留两位小数
# 5. 按总分排名(降序)
df['排名'] = df['总分'].rank(ascending=False, method='min').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, index=False)
print(f"✅ 处理完成!结果已保存到:{OUTPUT_FILE}")
print(f"📊 数据概览:最高分 {df['总分'].max()},最低分 {df['总分'].min()},平均分 {df['总分'].mean():.2f}")
# 运行主程序
if __name__ == "__main__":
process_scores()
使用步骤(5分钟上手)
第一步:安装依赖
打开命令行(Win+R输入cmd),运行:
bash
pip install pandas openpyxl
第二步:准备Excel文件
把成绩表保存为 学生成绩表.xlsx,放在脚本同目录下。表结构示例:
| 学号 | 姓名 | 语文 | 数学 | 英语 | 物理 | 化学 |
|------|------|------|------|------|------|------|
| 001 | 张三 | 85 | 92 | 78 | 88 | 90 |
| 002 | 李四 | 76 | 88 | 95 | 82 | 79 |
如果不想找测试文件,运行下面这段代码会自动生成示例数据:
python
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', index=False)
print("✅ 示例数据已生成")
第三步:修改配置区
打开脚本,找到配置区,根据你的表格修改:
-
SCORE_COLUMNS:改成你表格里成绩列的列名(如["高数", "线代", "概率论"]) -
STUDENT_ID_COL和STUDENT_NAME_COL:改成学号和姓名列名
第四步:运行脚本
bash
python 成绩处理脚本.py
输出效果:
text
✅ 成功读取文件,共 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无法对文本算平均分
解决: 修改脚本,在计算前把文本转成数字:
python
df[SCORE_COLUMNS] = df[SCORE_COLUMNS].apply(pd.to_numeric, errors='coerce').fillna(0)
可改参数(适配其他场景)
场景1:按科目分组排名(如理科班、文科班)
修改配置区,添加分组列:
python
GROUP_COL = "班级"
# 新增
在排名前加一句:
python
df['排名'] = df.groupby(GROUP_COL)['总分'].rank(ascending=False, method='min').astype(int)
场景2:只算部分科目(如只算三门主科)
修改 SCORE_COLUMNS:
python
SCORE_COLUMNS = ["语文", "数学", "英语"]
# 只算这三科
场景3:输出带百分比的成绩单
在保存前加一列:
python
total_score = len(SCORE_COLUMNS) * 100
df['得分率'] = (df['总分'] / total_score * 100).round(1).astype(str) + '%'
场景4:跳过空值(不填充为0)
把第27行的 fillna(0) 改成:
python
df = df.dropna(subset=SCORE_COLUMNS)
# 直接删除有缺失的行
总结
这个脚本我用了两年,从课程设计到帮老师处理期末成绩,从没翻过车。核心思路就是改路径就能跑,你只需要:
-
装好pandas
-
改对列名
-
双击运行
额外提醒: 这种批量处理Excel的技能,在校园里特别实用------帮导师整理实验数据、帮社团做活动统计,甚至接个几十块钱的小单子帮同学处理成绩表,都是顺手的事。但记住,代码能力才是根本,别为了接单耽误学习。
有什么问题评论区留言,看到必回。记得先跑通示例数据,再套用你自己的表格。