导出-每次考试/多考试对比: - 合格次数阈值等标记项抽为常显区块,三类成绩表共用 - 附缺考名单扩展到多考试导出(取所选考试全都没交的人) - 块表每场固定2列(成绩+合并空位),修复漏推空串导致的整行左移/串列 - 列宽按实际内容估算,合并区空位只给最小宽度 - 合格次数始终显示实际次数(含0),仅 ≥ 阈值标绿底 - 打印标题改为「成绩明细」,缺考名单分页单独成页 - 打印样式加 print-color-adjust:exact,绿底/红字可正常印出 数据大屏: - ?class= 班级大屏免登录公开访问,接口侧放行并按班级裁剪后回传 - 单班大屏移除退出按钮,仅首页保留 - 修复红绿判定真bug:membersTable 误用 window.DASH(DASH为let声明取不到) 改为 scoreGrade() 直接读自由变量,按后台合格率正确判红/黄/绿 测试/样例/文档同步更新,全量回归通过。
11 KiB
导出与打印
工具栏下方只有一个 导出 按钮,所有导出与打印的选项都收在这个弹窗里,不再散落多个小按钮。 选项在你打开弹窗前就配好了会自动记住(存本地),下次打开就是上次的设置。
生成的是
.xlsx:零依赖,仓库内自行实现 XLSX 写入,没有zip扩展也能用。
导出弹窗
| 分区 | 内容 |
|---|---|
| 导出内容 | 成绩明细 / 每次考试 / 缺考名单 / 多考试对比(四选一,选中后下方分区跟着变) |
| 统计范围 | 班级 / 组别多选(不选 = 全部,按住 Ctrl / ⌘ 多选) |
| 成绩口径与列 | 每人成绩(最新 / 最高)、排序、出表方式、按班级分工作表、附缺考名单 |
| 多考试对比 | 表格形态、对比成绩、勾选要对比的考试 |
| 附加内容 | 附缺考名单(成绩明细 / 每次考试 / 多考试对比 都出工作表) |
| 标记与合格次数 | 合格次数阈值、最高分标红、输出「合格次数」行 |
| 打印设置 | 纸张方向、打印标题 |
- 分区随「导出内容」显隐:选 缺考名单 时只保留范围与打印设置; 选 多考试对比 时才出现考试勾选表;
- 附加内容 与 标记与合格次数 是三类成绩表共用的,不随导出内容消失; 「按班级分工作表」只有成绩明细支持(置灰不可勾选);
- 弹窗底部有一句话汇总(导什么、哪些考试、多大范围),导错了一眼能看出来;
- 打印走隐藏 iframe 调起,不会被浏览器弹窗拦截挡掉,也不会多开标签页。
成绩明细:每人最新成绩 / 最高成绩
默认按每人最新成绩显示(最近一次真实提交),可选 最高成绩(该生在这些考试里的最高分)。
| 选项 | 效果 |
|---|---|
| 每人成绩 | 最新成绩(默认)/ 最高成绩 —— 每人一行时的代表成绩 |
| 排序 | 按提交时间 / 按学号 / 按成绩降序 / 按成绩升序 |
| 出表方式 | 每人一行(汇总)(默认)/ 每次考试一行(明细):明细模式保留每位学生的历史提交 |
| 附缺考名单 | 默认开;只导成绩时取消勾选(接口 noAbsent=1)。每次考试 / 多考试对比 也支持,口径为「名单里有、所选考试全都没交」 |
| 按班级分工作表 | 一个班级一个工作表(xlsx 多工作表) |
默认列:学号 / 姓名 / 班级 / 组别 / 成绩 / 最高分 / 考试次数 / 最近提交时间 / 考试时长 / 考试时长(秒)。
「每次考试」块表(多场对比,主推格式)
勾选多场考试,选 两行表头 形态。一列「第几次」被所有考试共用,每场考试占 2 列, 学生块末尾多一行 合格次数。
| 学号 | 姓名 | 第几次 | 第一次月考·数学 | 第一次月考·英语 | ||
|---|---|---|---|---|---|---|
| 成绩 | 成绩 | |||||
| (合并) | (合并) | 1 | 112 | 112 | 130 | |
| (合并) | (合并) | 2 | 100 | 129 | ||
| (合并) | (合并) | 3 | 136 | 133 | ||
| (合并) | (合并) | 合格次数 | 3 | 3 | ||
| 356002 | 李四 | 1 | (合并)未考 | 128 | ||
| (合并) | (合并) | 合格次数 | 1 |
规则:
- 学生块高度 = 该生在所有勾选考试里最多的那次次数 + 1(末行是合格次数);
- 学号 / 姓名按学生块纵向合并;第几次只合并到最后一次考试行,末行留给「合格次数」标签;
- 考试名称横跨 2 列,第二行是
成绩小标题; - 没考的考试(整场没有该生记录)→ 该场 2 列 × 学生块高合并成一个
未考格子; - 排序:学生按学号升序(出现班级 / 组别列时按 班级 → 组别 → 学号);
- 暂存草稿:默认不导出、也不占「第几次」编号。
单场考试的宽表版式
只导出 一场 考试时,改用更清楚的宽表:每人一行,第几次直接做列名。
| 学号 | 姓名 | 第1次 | 第2次 | 第3次 | 合格次数 |
|---|---|---|---|---|---|
| 356001 | 张三 | 112 | 100 | 136 | 3 |
| 356002 | 李四 | 128 | 1 |
导出与打印用的是同一套判定,所以单场和「多场块表」的标记完全一样。
红 / 绿标记
| 标记 | 条件 | 效果 |
|---|---|---|
| 最高分标红 | 该场该生成绩 = 该场最高分 | 红字加粗(同分只标最早达成的那次) |
| 合格次数标绿 | 该场该生达到合格线的次数 ≥ 阈值 | 绿底加粗 |
| 合格次数未达标 | 未达阈值 | 仍显示实际次数(含 0 次),只不标绿 |
- 合格线 = 该场本卷满分 × 合格率(每个试卷各自的配置,不是全场统一一条线);
- 阈值在弹窗里可改(默认 1 次);关掉「最高分标红」或「合格次数行」就只出表不标记;
- 整场没考的不参与合格次数判定,直接是
未考; - 学号等长数字列统一按文本格式写入,不会被 Excel 转成科学计数法,也不会被当公式执行;
- 打印与导出的 Excel 用同一份服务端装配结果(红字 / 绿底也来自同一份
cell_styles), 不存在「导出一个样、打印另一个样」。
班级 / 组别列什么时候出现
| 选择情况 | 班级列 | 组别列 |
|---|---|---|
| 只选 1 个班级、未选组别 | 不出 | 不出 |
| 选 ≥2 个班级 | 出 | 未选组别时按数据判断(数据跨多组才出) |
| 只选 1 个班级但选 ≥2 个组别 | 不出 | 出 |
| 什么都不选(= 全部) | 数据跨 ≥2 个班级才出 | 数据跨 ≥2 个组别才出 |
- 出列时连续相同班级 / 组别的单元格会纵向合并(顺序按 班级 → 组别 → 学号),一个班只占一格;
- 也可以用接口参数
withCls=1/withGrp=1强制出列(=0强制不出)。
其它形态
| 表格形态 | 产出 |
|---|---|
| 两行表头(每次考试 + 合格次数) | 上面那套块表(默认) |
| 成绩对比(每人一行) | 一行一个学生、一列一场考试,成绩取「最新」或「最高」 |
| 两者都出 | 第一张块表 + 第二张成绩对比表 |
文件名
成绩明细_<试卷名>[_<班级>][_<组别>][_最新成绩|_最高成绩]_<YYYYMMDD_HHMMSS>.xlsx
每次考试_<试卷名>[_<班级>][_<组别>]_<YYYYMMDD_HHMMSS>.xlsx
缺考名单_<试卷名>[_<班级>][_<组别>]_<YYYYMMDD_HHMMSS>.xlsx
多考试成绩对比_<N>场[_<班级…>][_<组别…>]_<最新成绩|最高分>_<YYYYMMDD_HHMMSS>.xlsx
每次考试与成绩对比_<N>场[_<班级…>][_<组别…>]_<YYYYMMDD_HHMMSS>.xlsx # 两者都出
跟随筛选
导出完全跟随页面当前的班级 / 组别筛选,缺考口径也与页面一致 (筛选后名单 − 筛选后已提交,按学号匹配),不会出现「页面上 30 人、导出 50 人」的情况。
打印
| 选项 | 说明 |
|---|---|
| 打印标题 | 默认按考试名自动生成,可改成学校 / 考试正式名称 |
| 纸张方向 | 多考试打印默认 横向(列多不折行),可改纵向 |
| 成绩明细的分组对比 | 按班级或组别分段,段首给出小计(人数 / 平均 / 最高 / 最低 / 合格人数与合格率) |
| 成绩明细的显示选项 | 显示名次、显示「是否合格」列、显示考试次数、附缺考名单 |
- 表头在每一页自动重复,行不会被切断到两页;两行表头都放进
<thead>; - 页眉含范围(班级 / 组别)、打印时间、人数、平均分、最高 / 最低、合格人数与合格线;
- 页脚含教师 / 教研组长签字栏与日期,可直接签字归档。
成绩明细面板右上角的打印与导出弹窗里的打印设置是同一套(打印标题、方向、分组对比都在弹窗里改)。
::: tip 绿底 / 红字要能印出来
打印样式里写了 print-color-adjust: exact,不需要在打印对话框里手动勾选「背景图形」,
Chrome / Edge 会照常输出绿底与红字。若仍看不到底纹,检查是否换用了不支持该属性的浏览器。
:::
::: tip 缺考名单单独成页 勾选「附缺考名单」后,缺考名单工作表会在打印时另起一页(不会挤在成绩表底部),便于分开归档。 :::
直接调用导出接口
需要对接其它系统时,可以带参数直接 GET(需已登录):
# 成绩明细(每人一行最新 / 最高)
api.php?action=export&projectId=xxx&cls=1班,2班&grp=A组&mode=latest&scoreMode=best&sort=score_desc
# 「每次考试」块表(多场)
api.php?action=export_multi&projectIds=a,b&mode=block&passTimes=1
# 单场宽表版式(每人一行,第几次做列名)
api.php?action=export_multi&projectIds=a&mode=block&wide=1
# 多考试:成绩对比 / 两者都出
api.php?action=export_multi&projectIds=a,b&mode=summary&scoreMode=highest
api.php?action=export_multi&projectIds=a,b&mode=both
# 「多考试打印」用的数据(不下载文件,返回 rows / merges / header_rows / cell_styles)
api.php?action=export_multi&projectIds=a,b&mode=block&format=json
# 缺考名单
api.php?action=export_absent&projectId=xxx
| 参数 | 取值 | 说明 |
|---|---|---|
projectId |
试卷 ID | 必填(export_multi 用 projectIds,逗号分隔,可只传一场) |
cls / grp |
班级 / 组别 | 与页面筛选一致;export_multi 支持多选(逗号分隔),空 = 全部 |
mode |
latest / all |
export 的成绩明细:每人一行(默认,取最新)/ 每次考试一行 |
scoreMode |
latest / best |
每人一行的代表成绩:最新(默认)/ 最高 |
mode(export_multi) |
block / summary / both |
每次考试块表(默认)/ 成绩对比 / 两者都出;旧值仍兼容:matrix→summary、merged·attempts→block |
wide |
1 |
单场 block 时改用宽表版式(每人一行、第几次做列名) |
passTimes |
正整数 | 合格次数达标阈值(默认 1) |
markBest |
0 |
=0 取消「最高分标红」 |
passRow |
0 |
=0 不输出「合格次数」行(也就没有绿底) |
format |
json |
不下载文件,返回 sheets(rows / merges / header_rows / cell_styles)供打印渲染 |
withCls / withGrp |
1 / 0 |
强制出 / 不出班级、组别列;缺省按上表规则自动判断 |
noAbsent |
1 |
成绩明细不附缺考名单 |
skipTemp |
1 |
mode=all 时排除暂存草稿 |
includeTemp |
1 |
每次考试块表保留暂存草稿(标注为 第N次(草稿)) |
sort |
time / sid / score_desc / score_asc |
成绩明细排序(块表恒按 班级 → 组别 → 学号 / 学号) |
split |
cls |
按班级拆分多工作表 |
cols |
逗号分隔列名 | 从默认列中挑选(仅 export) |
format=json 返回的 cell_styles 是 行,列 → red | green,行与列都是 1-based;
前端据此加红字 / 绿底,合并区间内的非首格继承左上角首格的标记。