PDF教学进程表 → Excel 智能转换技能
把人才培养方案 PDF 里的「教学进程表」一句话变成结构化 Excel —— 跨页、合并单元格、多学期课程自动拆分,专业信息自动识别,准确率 95%+。
更新重点
- v3.9.8:移除 SKILL.md 中冗余的 WorkBuddy 社区贡献声明和官方网站链接。
- v3.9.7:版本号更新,为 SkillHub 发布做准备。
- v3.9.6:精简 SKILL.md 文档(移除「本地分发」相关说明),新增「上手示例」小节。
- v3.9.5:修正「执行结果」Sheet 中「课程数(去重)」统计逻辑(多学期课程拆分后去掉末尾序号再去重,如"形势与政策1""形势与政策2"计为1门)。
- v3.9.4:修正「执行结果」Sheet 中「课程数(展开)」统计逻辑(多学期课程拆分后应按实际学期数计算)。
- v3.9.2:修正「各专业课程数明细」区块统计逻辑;修复 SkillHub 测评问题(文档与包内容一致、中文文件名乱码)。
概述
将高等学历继续教育人才培养方案 PDF 中的教学进程表一键转换为结构化 Excel 文件。Skill 内置了 v2.0+ 智能优化能力,无需用户手动分析 PDF 结构:
- 单文件模式:处理单个 PDF 文件(1 个专业)
- 批量处理模式:处理目录下所有 PDF(每个文件 1 个专业)
- 单文件多专业模式:处理单个 PDF(含多个专业)
支持智能识别:
- 专业信息(专业名称/代码/办学层次/学习形式)
- 学期列与考核列(自动排除混淆)
- 跨页表格(续页表头自动跳过、列数校验)
- 合并单元格(课程类别自动向下填充 + 字符多重集识别)
- 终结性考核√标记(直接读取标记列)
- 课程代码清洗(去除中文/特殊字符)
- 汇总行过滤("小计"、"合计"等)
- 课程性质(必修课/选修课)自动打标(v3.1)
- 选修课"至少选N门"自动合并单元格(v3.1)
输出支持三种方式:
- separate:每个专业一个独立 Excel
- merged:所有专业合并到一个 Excel 的不同 sheet
- merged-sheet:所有专业合并到同一个 sheet(通过"专业名称"列区分)
上手示例
> 👤 用户:把 /Users/lijiahui/Desktop/2027级培养方案/ 目录下的所有 PDF 教学进程表合并成一个 Excel,输出到 /Users/lijiahui/Desktop/output.xlsx,所有专业放一个 sheet 里。
> 🤖 WorkBuddy:
> 1. 扫描目录下 9 份 PDF,每个文件识别出 1 个专业
> 2. 自动提取专业信息(专业名称、代码、办学层次、学习形式)放到最前面
> 3. 拆分多学期课程(如"形势与政策"占 4 个学期 → 拆成 4 行)
> 4. 自动加序号(形势与政策1、形势与政策2…)
> 5. 合并到同一 sheet,按"专业名称"列区分
> 6. 生成"执行结果"Sheet,记录转换统计
> ✅ 3 秒后 Excel 生成在 /Users/lijiahui/Desktop/output.xlsx,含 1 个"教学进程表"Sheet(9 个专业)+ 1 个"执行结果"Sheet。
快速开始
1. 安装依赖
请使用系统 Python(不要使用 WorkBuddy 自带的 managed Python,存在代码签名问题)。
依赖包体积较大(含 pandas、pdfplumber 等),默认从国外 PyPI 下载可能很慢。安装时建议指定国内镜像源,例如清华大学 TUNA 镜像:
macOS / Linux:
python3 -m pip install -r requirements.txt \
-i https://pypi.tuna.tsinghua.edu.cn/simple \
--trusted-host pypi.tuna.tsinghua.edu.cn
Windows:
python -m pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn
> 也可将清华源配置为 pip 默认源(一次设置,永久生效):
> bash
> python3 -m pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
> python3 -m pip config set global.trusted-host pypi.tuna.tsinghua.edu.cn
>
> 配置后,以后直接用 pip install -r requirements.txt 即可走国内镜像。
2. 在 SkillHub 中启用 Skill
- 打开 WorkBuddy
- 进入「技能中心」/ SkillHub
- 搜索
pdf-teaching-schedule-to-excel - 点击「安装」即可启用
启用后,直接用自然语言告诉 WorkBuddy 你的需求即可,无需关心脚本细节。
使用方法
模式 A:单文件处理
适用场景:单个 PDF 文件,含 1 个专业的教学进程表
自然语言指令:
> "请将 [PDF文件绝对路径] 中的教学进程表转换为 Excel。
> 要求:
> 1. 自动提取专业信息(专业名称、代码、办学层次、学习形式)放到最前面
> 2. 区分线上/线下的理论和实验实训学时
> 3. 增加学期列(数字 1-N),多学期课程拆分为多行
> 4. 学分和学时按学期平均分配
> 5. 毕业论文/设计类课程不拆分
> 6. 多学期拆分后课程名称自动加序号(如"形势与政策1")
> 7. 课程代码自动清洗中文字符
> 8. 学期列放最后
> 输出到:[输出Excel绝对路径]"
模式 B:批量处理多份 PDF
适用场景:目录下有多个 PDF 文件,每个文件对应一个专业
自然语言指令:
> "请将 [目录绝对路径] 目录下的所有 PDF 文件中的教学进程表转换为 Excel。
> 要求:
> 1. 批量识别目录下所有 PDF
> 2. 输出方式:[separate / merged / merged-sheet]
> 3. 输出目录:[输出目录绝对路径]"
模式 C:单文件多专业处理
适用场景:单个 PDF 包含多个专业(如 2027 级培养方案合订本)
自然语言指令:
> "请将 [PDF文件绝对路径] 这个 PDF 文件中的所有专业的教学进程表转换为 Excel。
> 说明:这个 PDF 包含多个专业,每个专业有独立的专业信息页和教学进程表。
> 要求:
> 1. 自动识别 PDF 中的所有专业
> 2. 输出方式:[separate / merged / merged-sheet]
> 3. 输出目录:[输出目录绝对路径]"
Python 命令行调用
除 WorkBuddy 自然语言调用外,也可直接用 Python 调用脚本。
# 模式A:单文件处理
python scripts/smart_pdf_to_excel.py --mode A \
--input "/path/to/培养方案.pdf" \
--output "/path/to/output.xlsx"
# 模式B:批量处理(每个PDF一个专业)
python scripts/smart_pdf_to_excel.py --mode B \
--input "/path/to/pdf_dir" \
--output "/path/to/output.xlsx" \
--output-mode merged-sheet
# 模式C:单文件多专业处理
python scripts/smart_pdf_to_excel.py --mode C \
--input "/path/to/multi_major.pdf" \
--output "/path/to/output.xlsx" \
--output-mode merged
--output-mode 取值(仅 B/C 模式有效):
- separate(默认):每个专业一个独立 Excel
- merged:所有专业合并到一个 Excel 的不同 sheet
- merged-sheet:所有专业合并到同一个 sheet(通过"专业名称"列区分)
其他常用参数:
- --quiet:静默模式,只输出警告和错误
- --report <path>:输出 JSON 格式数据质量报告到指定路径
智能能力清单
| 智能能力 | 描述 |
|---|---|
| 自动匹配专业和教学进程表 | 扫描"专业名称"关键词,自动定位每个专业的教学进程表 |
| 自动识别学期列 | 按列头关键词分类,扫描√标记,自动建立列映射 |
| 智能跨页表格处理 | 检测续页表头并跳过,验证列数一致性 |
| 自动填充合并单元格 | 课程类别合并单元格自动向下填充 |
| 多学期自动拆分 | 自动拆分多学期课程,平均分配数值 |
| 课程名称自动加序号 | 拆分后自动加"形势与政策1"等序号 |
| 终结性考核√标记识别 | 直接读取√标记,无√则不记录 |
| 课程代码自动清洗 | 正则去掉中文字符,修复竖排文字污染 |
| 汇总行自动过滤 | 自动过滤"小计"、"合计"等行 |
| 三种输出方式 | separate / merged / merged-sheet |
| 课程类别字符多重集识别 | 处理 pdfplumber 字符按列错位(如"职业能力拓展课"→"职拓业展能课力") |
| 课程性质自动打标 | 必修课/选修课自动识别,列位置在课程名称之后 |
| 选课门数自动合并 | 同一课程类别下,必修课显示"必选",选修课显示"至少选【N】门"并自动合并单元格 |
| 执行结果 Sheet | 自动生成"执行结果"Sheet,记录转换时间、处理文件数、总课程数、多学期课程清单等 |
输出规范
Excel 列顺序
专业名称 | 专业代码 | 办学层次 | 学习形式 |
课程类别 | 课程代码 | 课程名称 | 课程性质 | 选课门数 | 学分 | 总学时 |
线上教学理论学时 | 线上教学实验实训学时 |
线下教学理论学时 | 线下教学实验实训学时 |
过程性考核 | 终结性考核 | 学期
> 💡 课程性质:必修课/选修课。
> 💡 选课门数:必修课显示"必选";选修课从"选修课小计"中自动提取 N,显示"至少选【N】门",并在同一课程类别下自动合并单元格(Excel 标准行为:仅左上角显示值)。
执行结果 Sheet
每次转换会自动追加一个「执行结果」Sheet,包含:
- 基本信息:转换时间、转换模式、PDF 来源、输出路径
- 处理统计:处理文件数、成功 / 失败数、总课程数
- 各专业课程数明细:每个专业的"课程数(去重)"、"课程数(展开)"、"多学期课程数"
- 多学期课程清单:列出所有被拆分的多学期课程
平台支持
| 平台 | 支持 | Python 路径 |
|---|---|---|
| macOS | ✅ | 系统 Python 3.8+ 或 brew install python@3.11 |
| Windows 10/11 | ✅ | 官方安装包 https://www.python.org/downloads/ |
| Linux | ✅ | 系统包管理器(apt/yum/dnf) |
> ⚠️ 禁止使用 WorkBuddy 自带的 managed Python(~/.workbuddy/binaries/python/),存在代码签名问题。
常见问题
| 错误现象 | 原因 | 解决方法 |
|---|---|---|
OSError: Operation not permitted |
使用了 managed Python | 改用系统 Python |
ModuleNotFoundError: No module named 'pdfplumber' |
依赖未安装 | pip install -r requirements.txt |
| 学期列只识别到 1 个 / 缺失第5学期 | auto_detect_semester_cols 只扫描教学进程表第一页,跨页续页的第5学期√标记被遗漏 |
v3.6+ 已改为扫描所有教学进程表页码,合并表头信息和√标记分布 |
| 课程类别大量空白 | 旧版本未做合并单元格填充 | v2.0+ 已自动向下填充 |
| 显示"公\n共\n基\n础\n课" | PDF 竖排文字 | v2.0+ 已自动清理 |
| 课程代码混入中文字符 | PDF 表格提取问题 | v2.2+ 已自动正则清洗 |
| 输出表头带"Unnamed: 10" | header 行某些列无名 | 已通过显式列顺序解决 |
| 课程类别大量空白("职拓业展能课力") | PDF 占位符 + 字符按列错位 | v3.1+ 已字符多重集识别 |
| 选修课至少选课门数未合并 | 旧版未做合并 | v3.1+ 已自动合并单元格 |
更多历史问题与解决方案,请查阅 references/UpdateLog.md。
进阶使用
- 用户日常使用手册:
references/SOP_UserManual.md - 技术实现细节 / 版本演进 / 跨平台命令对照:
references/UpdateLog.md
许可
本 Skill 遵循 MIT 协议,可自由使用、修改、分发。
贡献
欢迎提交 Issue 和 PR:
- 适配新 PDF 模板
- 优化识别准确率
- 补充更多输出格式(CSV、JSON 等)
- 跨平台兼容性改进
Skill 版本:3.9.8
最后更新:2026-07-21