手把手教你用Excel+Python实现学生奖惩档案数字化

1. 开发环境准备与依赖安装

在开始编码之前,需要确保本地已经安装了Python解释器。为了确保库的兼容性,建议使用Python 3.9及以上版本。如果尚未安装,请直接访问Python官网下载对应操作系统的安装包并完成安装,安装过程中务必勾选"Add Python to PATH"选项。

本项目核心依赖三个第三方库:pandas用于高效处理Excel数据,openpyxl用于读写xlsx文件格式,jinja2用于渲染HTML格式的数字化档案模板。打开终端或命令提示符,直接执行以下命令完成安装:

pip install pandas openpyxl jinja2

安装完成后,为了方便管理,建议在本地创建一个名为student_archive_system的文件夹,后续的所有代码文件和数据文件都将存放在此目录下。

2. 数据源Excel结构设计

为了实现自动化处理,必须规范输入数据的格式。请在项目根目录下新建一个名为data.xlsx的Excel文件。不要随意修改表头名称,因为代码将严格按照以下列名进行数据映射。

Excel文件应包含以下列,第一行为表头:

  • 学号:文本格式,学生的唯一标识。
  • 姓名:文本格式,学生姓名。
  • 班级:文本格式,如"三年二班"。
  • 类型:文本格式,仅允许填写"奖励"或"惩罚"。
  • 分值:数值格式,奖励为正数(如5),惩罚为负数(如-2)。
  • 日期:日期格式,记录奖惩发生的时间。
  • 详情:文本格式,具体事由描述。

为了方便测试,可以在data.xlsx中预填几条模拟数据,确保分值列包含正负数以验证逻辑正确性。

3. 数字化档案生成逻辑详解

本系统的核心逻辑是将扁平化的Excel表格记录,转换为按学生分类的结构化数据,并计算每个学生的综合德育分,最后生成可视化的HTML网页档案。HTML档案可以直接在浏览器中打开,方便打印或长期存档。

3.1 数据读取与清洗

使用pandas读取Excel文件时,会自动将第一行识别为表头。为了防止数据中存在空行导致计算错误,代码中会执行dropna()操作剔除无效记录。同时,将"日期"列强制转换为日期格式,确保档案中显示的时间标准统一。

3.2 档案分值计算规则

系统会自动根据"学号"对学生记录进行分组(Group By)。对于每一个学生,系统会遍历其所有的奖惩记录,利用sum()函数累加"分值"列,得出该学生的当前德育总分。这一步完全自动化,无需人工计算。

3.3 HTML模板渲染

为了生成美观的档案,我们定义了一个HTML字符串模板。模板中使用了jinja2的循环语法{% for item in records %}来动态插入每一条奖惩详情。样式部分直接内嵌了CSS,设置了表格边框、标题居中以及分数的颜色标记(正分显示绿色,负分显示红色),确保生成的页面直观易读。

4. 完整代码实现

在项目根目录下新建文件main.py,并将以下完整代码直接复制粘贴进去。该代码包含了所有必要的逻辑,包括文件检查、数据处理、HTML生成及异常捕获。

```python

import pandas as pd

手把手教你用Excel+Python实现学生奖惩档案数字化

from jinja2 import Template

import os

from datetime import datetime

定义HTML模板,用于生成档案页面 HTML_TEMPLATE = """ 学生奖惩档案 - {{ name }}

学生奖惩数字化档案

姓名:{{ name }}

学号:{{ student_id }}

班级:{{ class_name }}

生成时间:{{ generate_time }}

当前德育总分: {% if total_score >= 0 %} +{{ total_score }} {% else %} {{ total_score }} {% endif %}
{% for record in records %} {% endfor %}
日期 类型 分值 详情描述
{{ record.date }} {{ record.type }} {{ record.score }} {{ record.detail }}
""" def process_student_archives(): input_file = 'data.xlsx' output_dir = 'archives' 检查输入文件是否存在 if not os.path.exists(input_file): print(f"错误:未找到 {input_file} 文件,请确认文件路径。") return 创建输出目录 if not os.path.exists(output_dir): os.makedirs(output_dir) try: 读取Excel数据 df = pd.read_excel(input_file) 去除空值行 df = df.dropna(subset=['学号', '姓名']) 确保分值是数字 df['分值'] = pd.to_numeric(df['分值'], errors='coerce').fillna(0) 格式化日期 df['日期'] = pd.to_datetime(df['日期']).dt.strftime('%Y-%m-%d') 按学号分组 grouped = df.groupby('学号') print(f"开始处理档案,共发现 {len(grouped)} 名学生...") for student_id, group in grouped: 获取学生基本信息(取第一条记录的公共信息) name = group['姓名'].iloc[0] class_name = group['班级'].iloc[0] 计算总分 total_score = group['分值'].sum() 构建记录列表 records = [] for _, row in group.iterrows(): records.append({ 'date': row['日期'], 'type': row['类型'], 'score': int(row['分值值']), 'detail': row['详情'] }) 渲染HTML template = Template(HTML_TEMPLATE) html_content = template.render( name=name, student_id=student_id, class_name=class_name, total_score=total_score, records=records, generate_time=datetime.now().strftime('%Y-%m-%d %H:%M:%S') ) 保存文件 output_filename = f"{output_dir}/{name}_{student_id}.html" with open(output_filename, 'w', encoding='utf-8') as f: f.write(html_content) print(f"已生成档案:{output_filename}") print("所有档案处理完成,请查看 'archives' 文件夹。") except Exception as e: print(f"处理过程中发生错误:{str(e)}") if __name__ == "__main__": process_student_archives()

```

5. 程序运行与结果查看

代码编写完毕后,即可进行实际运行。确保data.xlsxmain.py在同一目录下。在终端中执行以下命令启动程序:

python main.py

程序运行后,终端会实时显示处理进度。如果一切顺利,当前目录下会自动生成一个名为archives的文件夹。打开该文件夹,你会会看到每个学生都对应生成了一个独立的HTML文件。

双击任意一个HTML文件,浏览器将展示该学生的详细奖惩档案。页面顶部会自动计算出该学生的德育总分,正分显示为绿色,负分显示为红色,下方表格详细列出了每一次奖惩的时间、类型和具体事由。这种格式非常适合直接打印纸质存档,或者作为电子数据发送给家长和学生。

6. 常见问题与排错

在实操过程中,可能会遇到ModuleNotFoundError,这通常是因为虚拟环境未激活或依赖未安装在当前Python环境中。请务必重新检查pip list中是否存在步骤1中安装的三个库。

如果遇到KeyError,请检查data.xlsx的表头名称是否与代码中的要求完全一致,包括不能有空格。Excel文件必须处于关闭状态,程序才能对其进行读取操作。

AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

扫码咨询
安答联动微信公众号二维码

微信扫码关注安答联动

申请试用
热线电话
申请试用

安答联动档案管理系统