python openpyxl处理Excel成绩表自动统计

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

# 直接删除有缺失的行

总结

这个脚本我用了两年,从课程设计到帮老师处理期末成绩,从没翻过车。核心思路就是改路径就能跑,你只需要:

  1. 装好pandas

  2. 改对列名

  3. 双击运行

额外提醒: 这种批量处理Excel的技能,在校园里特别实用------帮导师整理实验数据、帮社团做活动统计,甚至接个几十块钱的小单子帮同学处理成绩表,都是顺手的事。但记住,代码能力才是根本,别为了接单耽误学习。

有什么问题评论区留言,看到必回。记得先跑通示例数据,再套用你自己的表格。

相关推荐
梦想不只是梦与想1 小时前
Python 官方包管理器pip
python·pip
wahahaman2 小时前
基于GBDT的次日降水量预测实验
人工智能·python·机器学习·数据分析
Nontee2 小时前
数据类型与包装类 — 一个新手学Java的数据类型笔记
java·笔记·python
千天夜3 小时前
深入剖析 `Path(path).parent.mkdir(parents=True, exist_ok=True)` —— 优雅处理目录创建的终极方案
python
简~7683 小时前
python for in循环不能遍历整数怎么解决
python·大学生
aiqianji3 小时前
垂直专业的AI短篇小说写作软件有哪些特点?
人工智能·python
aqi004 小时前
15天学会AI应用开发(十三)上下文与RAG的阶段性总结
人工智能·python·大模型·ai编程·ai应用
程序员杰哥4 小时前
接口测试知识总结
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试