将教务选课表一键转换为 A3 版芯周课表,支持中英文双语、自动填格、导出 PDF / 打印申请包。
本工具为国际学生(及有双语课表需求的师生)设计,解决从教务系统导出的 Excel 选课表到可视化周课表的排版难题。
- 无需安装:浏览器打开即用
- 数据安全:所有数据保存在你的浏览器本地(localStorage),不上传任何内容
- 排版合规:导出文件带“非官方排版对照件”水印,并强制确认使用责任
| 模块 | 功能 |
|---|---|
| 选课表管理 | 导入教务 Excel(无表头 10 列或带表头变体)、下载中英文示例、课程名称就地编辑、网课标记 |
| 周课表 | 周一至周日,每格三栏递进填写选课序号,自动显示课程名称、时间、地点、教学班号、周次提示 |
| 自动填格 | 解析“上课时间”字段,智能填入对应格子(上栏→中栏→下栏) |
| 课次时间计算 | 自定义每日开始时间、课时长、休息间隔,实时重算所有时段 |
| 撤销 / 重做 | 支持 Ctrl+Z / Ctrl+Y,历史栈最多 60 步 |
| 导出与打印 | 浏览器打印(A3)、双语 PDF(中英文各一页 A3)、申请包(封面信息页 + A3 课表) |
| 校徽水印 | 上传校徽图片,自动转为半透明水印叠加于 A3 版芯及 PDF |
| 合规与隐私 | 导出前强制输入确认短语、姓名 SHA‑256 哈希仅存 sessionStorage、所有文件标注“非官方” |
| 中英文界面 | 一键切换语言(中文/英文/跟随浏览器),课表表头同步翻译 |
| 数据持久化 | 自动保存至 localStorage,刷新不丢失,支持一键清除全部缓存 |
以下为截图示例(实际界面以在线版本为准)
| zh-视图 | en-视图 |
|---|---|
![]() |
![]() |
直接访问 https://qinsanlian.github.io/enrollment-timetable-comparison/
git clone https://github.com/Qinsanlian/enrollment-timetable-comparison.git
cd enrollment-timetable-comparison/course-timetable
npm install
npm run dev浏览器打开 http://localhost:5173 即可。
- 导入 Excel:点击侧栏“导入 Excel…”,选择教务导出的选课表(支持
.xlsx/.xls/.csv)。
系统会自动识别“无表头 10 列”或“带表头”格式,并根据课程名/类别/时空字段推断是否为网课。 - 下载示例:若不确定格式,可先点击“下载中文/英文选课表示例”,参照该模板整理数据。
- 手动编辑:表格内的课程名称可直接双击修改(中文界面修改中文名,英文界面修改英文名)。
- 网课标记:勾选“网课”列复选框后,该课程将不会参与周课表自动填格,序号前会显示
*。
- 每个格子分为上、中、下三栏,对应输入选课表里的序号。
- 只填一栏时,格子自动居中显示该课程信息;填两栏时显示为上下两课(中间有虚线分隔)。
- 点击格子右上角的
+按钮可激活第三栏(需先填写中栏)。 - 点击
-按钮可移除第三栏并清空其序号。
- 点击“按上课时间自动填格”,系统会解析每门课程的“上课时间”字段,将序号填入对应的星期·节次格子。
- 填格规则:上栏空则填上栏;上栏有、中栏空则填中栏;上中都有、下栏空则填下栏并自动激活第三栏。
- 若某格已有三门课程且三栏已满,后续课程会被跳过,格子左上角会出现红色
+N徽章,鼠标悬停可查看具体未填入的课程。
- 在侧栏“课次时间计算器”中可修改:
- 每日课程开始时间(如
08:00) - 每节课时长(分钟)
- 课中休息、课间休息、午休、傍晚休息时长
- 每日课程开始时间(如
- 点击“计算并应用”后,周课表所有格子的时段会立即更新。
- 打印 / PDF:浏览器打印对话框(建议选择 A3 纸张、缩放 100%、关闭页眉页脚),会自动附加“非官方排版对照件”文字水印。
- 导出 PDF (A3 双语):生成两份 A3 版芯(中文页 + 英文页),合并为一个 PDF 文件。
- 导出申请包:生成包含封面信息页(含数据一致性声明)和 A3 课表的 PDF,适合作为选课材料提交。
- 所有导出操作前都会弹出“导出前自查清单”,并随机生成一句确认短语,用户需逐字输入后方可继续。
- 点击侧栏“导入校徽图片”,选择一张彩色图片(建议方形或圆形)。
- 图片会自动转为半透明、降低饱和度,并居中显示于 A3 版芯上。
- 导出 PDF 时水印也会一并输出。
- 点击“移除水印”可清除。
- 清除全部数据:点击“清除本机全部缓存数据”会删除所有 localStorage 数据并刷新页面。清除前会提示是否下载 JSON 备份。
- 导入备份文件:可将之前导出的 JSON 备份重新加载,恢复选课表、周课表、语言偏好等。
| 类别 | 技术 |
|---|---|
| 构建工具 | Vite 6 |
| 类型系统 | TypeScript 5.6(严格模式) |
| 样式 | 原生 CSS(CSS 变量 + A3 物理尺寸) |
| PDF 生成 | jsPDF 2.5.1(CDN) |
| Canvas 截图 | html2canvas 1.4.1(CDN) |
| Excel 解析 | SheetJS (xlsx) 0.20.3(CDN) |
| 测试框架 | Vitest + Happy‑DOM |
| 部署 | GitHub Pages + GitHub Actions |
course-timetable/
├── index.html # Vite 入口 HTML
├── package.json
├── tsconfig.json
├── vite.config.ts
└── src/
├── main.ts # 桥接入口,挂载 window.__tsBridge
├── types.ts # 核心 TypeScript 类型定义
├── constants.ts # 全局常量(DAYS, SLOTS, LS_KEY 等)
├── styles/
│ └── main.css # 完整样式(A3 布局、打印、响应式)
├── utils/
│ ├── helpers.ts # 通用工具函数
│ └── watermark.ts # 图片水印处理模块
├── core/
│ ├── course-model.ts # 选课数据模型与处理
│ ├── schedule-parser.ts # 上课时间解析器
│ ├── slot-times.ts # 课次时间计算引擎
│ └── autofill.ts # 自动填格核心算法(纯函数)
├── state/
│ ├── storage-adapter.ts # localStorage 安全封装
│ ├── compliance-log.ts # 合规操作日志
│ ├── slot-config-store.ts # 课次时间配置持久化
│ ├── enroll-store.ts # 选课数据持久化
│ ├── grid-store.ts # 周课表数据持久化
│ └── app-state.ts # 全局状态管理器(撤销/重做)
└── legacy.js # UI 事件与渲染逻辑(逐步迁移中)
欢迎提交 Issue 和 Pull Request!
- Fork 本仓库
- 创建特性分支
git checkout -b feature/your-feature - 提交修改
git commit -m 'feat: add something' - 推送到分支
git push origin feature/your-feature - 发起 Pull Request
请确保提交前运行 npm run build 构建通过,并尽量保持代码风格与现有模块一致。
- 鱼皮编程导航 提供的项目灵感
- 所有参与测试和反馈的用户
- 感谢国家和社会提供的安全环境,让合规开发成为可能
免责声明:本工具仅供排版辅助,所有数据的真实性由使用者负责。导出文件均标注“非官方排版对照件”,不作为学校正式文件。

