Transcript Analysis → Excel
Parse an academic transcript PDF, structure the data, export a styled .xlsx, and summarize findings for the student/advisor.
Quick start
- Locate input: user-provided PDF path (e.g.
成绩单/SSR_TSRPT(1).pdf).
- Read source: open the PDF and extract all visible text — student info, every term block, every course row, GPA lines, milestones, footers.
- Build JSON matching reference.md schema. Do not invent grades or credits.
- Export Excel:
python3 -m pip install openpyxl pandas
python3 ~/.cursor/skills/transcript-analysis-excel/scripts/build_transcript_excel.py \
--input "/path/to/transcript.json" \
--output-dir "/same/folder/as/pdf"
- Deliver to user:
{FamilyName}_{GivenName}_{Institution}_Transcript.xlsx path
- Chinese analysis summary (see template below)
- Ask if missing: output folder, preferred filename, whether to include in-progress courses.
Workflow checklist
- [ ] PDF read page-by-page; no courses or GPA lines skipped
- [ ] Student info captured (name, ID, institution, print date, document type)
- [ ] Each term: program, plan/subplan, special notes (leave, end of study)
- [ ] Every course: code, description, credits, grade, optional topic line
- [ ] Term GPA + cumulative GPA rows captured per term
- [ ] Milestones / non-course requirements captured
- [ ] transcript.json written
- [ ] build_transcript_excel.py succeeded
- [ ] Analysis summary delivered in chat
Extraction rules
Course rows
- Preserve course code and description exactly as printed.
- If a
COURSE TOPIC(S): line follows a course, store it in course_topic.
- Credits
0.00 with no grade → mark (In Progress) unless source shows another status.
- Non-GPA grades (e.g.
SX, P, W, AU) → keep verbatim; exclude from grade-distribution sheet.
Term blocks
- New term starts at headers like
FALL 2023, SPRING 2024, SUMMER 2022.
- Capture
Program:, Plan:, Subplan:, Leave of Absence:, End of Study: when present.
- Terms with GPA lines but no courses still go in
term_gpa (e.g. gap semester).
Academic trajectory
- Infer
academic_history from program/plan changes across terms.
- Note major transfers, leave of absence, gap terms, current in-progress enrollment.
Numbers
- Do not recalculate GPA unless the user asks.
- Use values exactly as printed on the transcript.
JSON file shape
Minimal structure (full schema in reference.md):
{
"student_info": {
"university": "Cornell University",
"student_name": "Matthew Ma",
"student_id": "5460928",
"date_printed": "6/2/2026",
"document_type": "Unofficial Transcript",
"current_program": "Business",
"current_major": "Applied Economics & Management Major (AECN-BS)",
"concentrations": "Entrepreneurship Concentration; Finance Concentration",
"cumulative_gpa": "3.011",
"cumulative_credits": "89.00"
},
"academic_history": [],
"courses": [],
"term_gpa": [],
"milestones": []
}
Save as {stem}_transcript.json next to the PDF before running the build script.
Excel output (6 sheets)
| Sheet |
Content |
| 学生信息 |
Key-value student summary |
| 学业轨迹 |
Program/major timeline with notes |
| 课程明细 |
All courses by term |
| 学期GPA |
Term + cumulative GPA per term |
| 成绩分布 |
Count of letter grades (GPA-eligible only) |
| 里程碑 |
Non-course milestones (swim test, etc.) |
Default output name: {FamilyName}_{GivenName}_{InstitutionShort}_Transcript.xlsx
Analysis summary template
After exporting, reply with a concise Chinese summary:
## 成绩单分析摘要
### 基本信息
| 项目 | 内容 |
|------|------|
| 学校 | … |
| 学生 | … |
| 累计 GPA | … |
| 累计学分 | … |
### 学业轨迹
[Bullet timeline: programs, major changes, leave/gap terms]
### 学期 GPA 走势
[Table: Term | Term GPA | Cum GPA | 备注]
### 课程统计
[Total courses; SX/non-GPA count; in-progress count; grade distribution highlights]
### Excel 文件
[Full path to .xlsx and sheet list]
Highlight advisor-relevant signals: major transfer, GPA dips/recovery, leave of absence, weak subject clusters, in-progress credits needed to graduate.
Edge cases
| Situation |
Action |
| Scanned/image-only PDF |
Tell user OCR is needed; do not guess text |
| Chinese university transcript |
Same workflow; column headers may differ — map to courses schema |
| Multiple degrees on one PDF |
Separate academic_history segments; one combined Excel is OK unless user wants split files |
| Official vs unofficial |
Record document_type exactly; do not upgrade wording |
| User also wants English translation |
Hand off to translate-academic-credentials skill separately |
Additional resources
- JSON schema & grade-code rules: reference.md
- Worked example (Cornell): examples.md
- Sample JSON fixture: examples/matthew_ma_cornell.json
1---2name: transcript-analysis-excel3description: Analyzes academic transcript PDFs (成绩单), extracts courses/GPA/milestones, produces a structured multi-sheet Excel workbook, and delivers a Chinese analysis summary. Use when the user asks to 分析成绩单, 成绩单转Excel, 成绩单分析, transcript analysis, parse transcript PDF, SSR_TSRPT, unofficial transcript, or save transcript data as .xlsx.4---56# Transcript Analysis → Excel78Parse an academic transcript PDF, structure the data, export a styled `.xlsx`, and summarize findings for the student/advisor.910## Quick start11121. **Locate input**: user-provided PDF path (e.g. `成绩单/SSR_TSRPT(1).pdf`).132. **Read source**: open the PDF and extract **all** visible text — student info, every term block, every course row, GPA lines, milestones, footers.143. **Build JSON** matching [reference.md](reference.md) schema. Do not invent grades or credits.154. **Export Excel**:16 ```bash17 python3 -m pip install openpyxl pandas18 python3 ~/.cursor/skills/transcript-analysis-excel/scripts/build_transcript_excel.py \19 --input "/path/to/transcript.json" \20 --output-dir "/same/folder/as/pdf"21 ```225. **Deliver to user**:23 - `{FamilyName}_{GivenName}_{Institution}_Transcript.xlsx` path24 - Chinese analysis summary (see template below)256. **Ask if missing**: output folder, preferred filename, whether to include in-progress courses.2627## Workflow checklist2829```30- [ ] PDF read page-by-page; no courses or GPA lines skipped31- [ ] Student info captured (name, ID, institution, print date, document type)32- [ ] Each term: program, plan/subplan, special notes (leave, end of study)33- [ ] Every course: code, description, credits, grade, optional topic line34- [ ] Term GPA + cumulative GPA rows captured per term35- [ ] Milestones / non-course requirements captured36- [ ] transcript.json written37- [ ] build_transcript_excel.py succeeded38- [ ] Analysis summary delivered in chat39```4041## Extraction rules4243### Course rows44- Preserve course code and description exactly as printed.45- If a `COURSE TOPIC(S):` line follows a course, store it in `course_topic`.46- Credits `0.00` with no grade → mark `(In Progress)` unless source shows another status.47- Non-GPA grades (e.g. `SX`, `P`, `W`, `AU`) → keep verbatim; exclude from grade-distribution sheet.4849### Term blocks50- New term starts at headers like `FALL 2023`, `SPRING 2024`, `SUMMER 2022`.51- Capture `Program:`, `Plan:`, `Subplan:`, `Leave of Absence:`, `End of Study:` when present.52- Terms with GPA lines but **no courses** still go in `term_gpa` (e.g. gap semester).5354### Academic trajectory55- Infer `academic_history` from program/plan changes across terms.56- Note major transfers, leave of absence, gap terms, current in-progress enrollment.5758### Numbers59- Do **not** recalculate GPA unless the user asks.60- Use values exactly as printed on the transcript.6162## JSON file shape6364Minimal structure (full schema in [reference.md](reference.md)):6566```json67{68 "student_info": {69 "university": "Cornell University",70 "student_name": "Matthew Ma",71 "student_id": "5460928",72 "date_printed": "6/2/2026",73 "document_type": "Unofficial Transcript",74 "current_program": "Business",75 "current_major": "Applied Economics & Management Major (AECN-BS)",76 "concentrations": "Entrepreneurship Concentration; Finance Concentration",77 "cumulative_gpa": "3.011",78 "cumulative_credits": "89.00"79 },80 "academic_history": [],81 "courses": [],82 "term_gpa": [],83 "milestones": []84}85```8687Save as `{stem}_transcript.json` next to the PDF before running the build script.8889## Excel output (6 sheets)9091| Sheet | Content |92|-------|---------|93| 学生信息 | Key-value student summary |94| 学业轨迹 | Program/major timeline with notes |95| 课程明细 | All courses by term |96| 学期GPA | Term + cumulative GPA per term |97| 成绩分布 | Count of letter grades (GPA-eligible only) |98| 里程碑 | Non-course milestones (swim test, etc.) |99100Default output name: `{FamilyName}_{GivenName}_{InstitutionShort}_Transcript.xlsx`101102## Analysis summary template103104After exporting, reply with a concise Chinese summary:105106```markdown107## 成绩单分析摘要108109### 基本信息110| 项目 | 内容 |111|------|------|112| 学校 | … |113| 学生 | … |114| 累计 GPA | … |115| 累计学分 | … |116117### 学业轨迹118[Bullet timeline: programs, major changes, leave/gap terms]119120### 学期 GPA 走势121[Table: Term | Term GPA | Cum GPA | 备注]122123### 课程统计124[Total courses; SX/non-GPA count; in-progress count; grade distribution highlights]125126### Excel 文件127[Full path to .xlsx and sheet list]128```129130Highlight advisor-relevant signals: major transfer, GPA dips/recovery, leave of absence, weak subject clusters, in-progress credits needed to graduate.131132## Edge cases133134| Situation | Action |135|-----------|--------|136| Scanned/image-only PDF | Tell user OCR is needed; do not guess text |137| Chinese university transcript | Same workflow; column headers may differ — map to `courses` schema |138| Multiple degrees on one PDF | Separate `academic_history` segments; one combined Excel is OK unless user wants split files |139| Official vs unofficial | Record `document_type` exactly; do not upgrade wording |140| User also wants English translation | Hand off to `translate-academic-credentials` skill separately |141142## Additional resources143144- JSON schema & grade-code rules: [reference.md](reference.md)145- Worked example (Cornell): [examples.md](examples.md)146- Sample JSON fixture: [examples/matthew_ma_cornell.json](examples/matthew_ma_cornell.json)