综测材料整理
从一堆学院下发的"各部门汇总"里,找出属于某个学生的全部加分材料、按原文件算出分数、产出可提交的 Word。
铁律 0 · 只准「复制原模板 + 填内容」,严禁自己画表格/重建模板(最高优先级)
学院/班级下发的分表、材料表、封面、汇总表,一律复制原件,只在它既有的表格单元格或正文里写内容。
不得用 OOXML 拼接、python-docx、docxgen 之类重新画一张表、重建一个模板 —— 哪怕你自认为排版"看起来一模一样"。
为什么这是铁律:这些文件要和同班其他同学的材料合并、要交给学院逐份审核/打印,模板里往往有合并单元格、页眉页脚、页码域、固定说明行(如"注意:请大家按照这个顺序…")。自己画的表在合并、跨页、打印、审查时必然出问题 —— 那叫"改格式",用户会直接拒收。
正确顺序(缺一不可):
- 先找原件。 当前轮的模板目录如果已被填过/改过,就去上一轮(第二批)同名目录复制干净原件;再不行就找学院下发的原始压缩包。绝不凭记忆重建。
Copy-Item把原件复制到输出目录 —— 原件本身一个字都不改,只读它、复制它。- 用 Word COM 编辑那个副本:只写单元格、只追加段落与图片。
- 保存用
$d.Save()(原地保存,格式自然保持 .doc),禁止SaveAs2(本环境会死锁)。 - 打开用
$d.OpenNoRepairDialog($path, $false, $false)。
只有原件确实不存在时,才允许自建文档,并且必须显式告诉用户"这是重建的、不是原模板",让用户决定要不要用。
填官方 .doc 模板的三个必备开关(本环境实测,照抄即可)
| 现象 | 真实原因 | 解决 |
|---|---|---|
| 打开报「Office 检测到此文件存在一个问题。为帮助保护您的计算机,不能打开此文件。」 | Office 文件验证(File Validation)拦下了 WPS 生成的零内容 .doc(9,216 B、正文 0 字那种"空模板") | 建 HKCU:\Software\Microsoft\Office\16.0\Word\Security\FileValidation,EnableOnLoad(DWORD)=0。不是文件损坏,别急着判它损坏 |
Documents.Open 卡死十几分钟不返回 |
文件带 WPS 私有流(WpsCustomData)时 Word 想弹修复/转换对话框;Visible=$false 下是隐形模态框,永远等不到人点 |
改用 $w.Documents.OpenNoRepairDialog($p,$false,$false);实测 425 ms 打开成功 |
SaveAs2(path, 0或16) 卡死 |
本环境 Word 的"另存为"会挂(与格式无关) | 只用 $d.Save() 原地保存。原地保 .doc 正好就是"不改格式",一举两得 |
配套动作:每次开工先 Stop-Process WINWORD -Force 清僵尸进程,并删 HKCU:\Software\Microsoft\Office\16.0\Word\Resiliency 与 %APPDATA%\Microsoft\Word\*.asd。
> 参考实现:scripts/fill_official_doc.ps1(复制原件→填单元格→追加图文→Save()),内容清单由 content.json 驱动。
铁律 1~3(优先级高于本 skill 里的任何示例数值)
铁律 1 · 一切以「本次拿到的原文件」为准
本 skill 及 reference.md 里出现的所有分值、公式、上限、五育划分、基本分,都只是"通常长什么样"的形态参考,不是依据。
不同学院、不同学年都可能改:有的学院德育 20 / 智育 65 / 体育 5 / 美育 5 / 劳育 5,有的不是;基本分、加分上限、计算公式、甚至维度名称都可能不一样。
开工第一件事:从本次的《实施办法》《加分细则表》里逐条抄出规则,落成工作目录下的 本次规则.md。
之后所有计算只引用 本次规则.md,不得引用本 skill 或 reference.md 里的数字。
本次规则.md 至少要抄到:
- 五育各占多少分、总分多少
- 每个维度的计算公式(如"得分 = 基本分 + 加分 − 扣分")与基本分
- 每个维度的加分上限、以及各子类上限
- 通用原则:同类取最高/不重复累加/任职是否只取最高两项、按什么比例折算
- 统计区间(材料时间范围)、评奖评优的分数门槛
铁律 2 · 每一条加分都必须能溯源到原文件的具体位置
- 材料位置:文件名(相对路径)→ 页码 → 行 → 列;Excel 给
工作表!单元格;Word 表格给表N 第r行第c列。 - 分值依据:哪份文件的第几页、第几条。
- 输出表里"分值"和"位置"必须并列成列 —— 只写结论不写位置,等于没做。
- 溯不到的不计入合计,单独列成「无法溯源(待补凭证)」清单。
- 版式表格类材料必须给行列号 + 红框截图,让人能一眼核对。
铁律 3 · 原文件里没有的,必须提醒用户,不要自己补
找不到就用提问代替假设:不套用旧学年数值、不套用别的学院数值、不"按经验估一个"。
在输出里显式标注"缺依据/待核定",并走下方《缺失即提醒》清单。
核心心法(三条,决定你会不会漏)
- "按名字搜不到" ≠ "没有加分"。
班级集体荣誉、寝室类加分、团体项目是按 班级名 / 宿舍号 记的,压根不会出现学生姓名。搜完姓名必须再按班级、宿舍搜一轮。 - "材料位置"和"加分描述"通常不在同一个文件里。
名单/公示证明"你参加了";细则表/实施办法证明"值多少分"。两份都要找到,且都要把出处写进结果表。 - "发生时间"决定能不能算。
证书本身长期有效,但综测只认统计区间内发生/获得的材料(区间以本次规则.md抄到的为准)。跨界的要单独列出并提示"本学年不计",不要悄悄丢掉,也不要混进去。
算分模型:从原文件提取,不要预设
> 下面这个形态只是帮助识别"长什么样",绝不能当依据:
> 德育 20(基本分 12 + 加分 − 扣分)+ 智育 65 + 体育 5 + 美育 5 + 劳育 5。
> 你们学院这一学年的版本可能完全不同。
做法(见铁律 1):读本次《实施办法》→ 抄出维度/公式/基本分/上限/原则 → 写进 本次规则.md → 只引用它。
各维度具体能加什么、值多少分,一律读本次各部门《加分细则表》;部门细则与实施办法冲突时,具体规定(细则表)优先,并把差异记下来。
缺失即提醒(找不到就停下来问用户,不要自己补)
整理过程中,下列任何一项在原文件里找不到,都必须主动提醒,不要猜、不要套旧值:
| 找不到什么 | 影响 | 怎么提醒 |
|---|---|---|
| 本次《实施办法》全文 | 算分模型/上限/原则全无依据 | 让用户找班委/学院索取;否则只列材料、不定分 |
| 五育分值/基本分/公式 | 总分算不出来 | 只出"加分合计",不出"总分",并注明缺依据 |
| 某维度的加分上限 | 可能超上限 | 标注"上限未知,按 X 分暂计待核" |
| 某部门的《加分细则表》 | 该部门活动的分值无依据 | 列出活动,分值写"待部门核定" |
| 证书/活动的名单凭证 | 无法溯源 | 进「待补凭证」清单,不计入合计 |
| 分值档位的口径(如四级大一/大二/大三) | 档位不同分值不同 | 把各档都列出,请用户确认是哪一档 |
| 材料的发生时间 | 是否落在统计区间内 | 明确标出区间;跨越区间的单列并提示"本学年不计" |
| 技能证书「认定名目」 | 证书能不能算 | 提示"条文要求以名目为准,但目录里没有这份名目" |
| 干部/寝室长的考核等级(优秀/良好/合格) | 职位类加分档位不同 | 索取考核公示文件;拿不到就按最低档并标注 |
| 评奖评优门槛(如德育≥N、绩点≥X) | 能否参评 | 从实施办法提取;找不到就问,别默认 |
检索流程(由窄到宽,每步问自己"还漏了什么")
按顺序做,不要跳步。每步的升级理由要记住,因为"为什么搜不到"往往就是下一步的线索。
第 1 步:按姓名搜(含书写变体)
- 变体要全:
张三、张 三/张 三(两字名在红头文件里常被排成"张 三")、以及生僻单字兜底。 - 单字兜底很关键:OCR 或字体映射出问题时会整名认错,但生僻字单独出现通常还是能查到。
- 全库统计"含该字"与"含全名"的文件数,差距大就说明有漏。
第 2 步:换身份线索 —— 学号、手机号
- 学号是最可靠的线索:数字不受字体/OCR 影响。用学号整串搜,再用班级学号段搜同班同学做交叉验证。
- 手机号也常出现在报名表里,能捞到名字被写错/漏写的表。
- 判定逻辑:Excel 里某表能查到 6 个同班同学的学号、却查不到你的 → 基本可确认你不在该表(而非漏读)。
第 3 步:换归属线索 —— 班级名、宿舍号(最容易漏的一步)
- 按 班级号 搜,专门找集体类项目:
- 集体荣誉:优秀组织奖、先进班集体、五四活力/红旗团支部、对标定级五星/四星团支部、文明班级
- 团体项目:运动会方阵、拔河/长绳/三大球等班级集体项目
- 按 宿舍号 搜,找寝室类:
- 优寝/差寝次数统计、文明寝室/特色寝室/样板间评选、寝室长加分
- 这一步常常是"白捡分",也是"白扣分"的来源(差寝会扣分)。
第 4 步:按文件类型逐个击破
| 类型 | 怎么读 | 能给的位置精度 |
|---|---|---|
| 有文字层 PDF | PyMuPDF page.search_for() / get_text() |
页码 + 行 + 列 + 红框截图 |
| 扫描件 PDF(无文字层) | 渲染成图 + Windows OCR(zh-Hans-CN) | 页码 |
| xlsx | openpyxl 遍历单元格 | 工作表 + 行 + 列 |
| docx | zipfile 解包 XML,扫全部 part(正文/表格/页眉页脚/文本框) |
表格 + 行 + 列 |
| xls(BIFF8) | 自写 CFB+BIFF8 解析器(见 scripts/xlsread.py) |
工作表 + 行 + 列 |
| doc(Word97) | 字节级搜 UTF-16LE / GBK / UTF-8 | 命中与否 + 上下文 |
第 5 步:排查"文字层盲区"
有文字层的 PDF 里也可能夹着整页扫描图,姓名藏在图里就搜不到。
做法:算每页图片覆盖率(get_image_rects 面积 / 页面积),覆盖率 > 45% 的页也要 OCR。
第 6 步:跳出"名单",去搜"依据"
光找到名单不够,必须找到分值出处并抄进 本次规则.md:
- 本次《本科生综合测评实施办法》——看附件(五育细则、学生干部加分对照表、非学科竞赛类活动加分对照表)
- 各部门《加分细则表》——部门自定的具体数值(往往与实施办法不同,以细则表为准)
- 确无依据时,可引用上一学年/旧学院的办法作为"先例",但必须在结果里标注"口径风险:非本次文件,待学院确认",不能当既定分值
第 7 步:跳出目录、跳出磁盘位置
- 学院换过名/合并过的学生,旧学院的办法正文可能还在电脑里,而且老办法有时把某些证书列得更细。
- 搜索范围要覆盖:整个工作目录 → 用户目录(Desktop/Downloads/Documents)→ QQ/微信接收文件夹 → 全盘按文件名搜"实施办法/测评办法/学生手册/认定名目"。
- 这一层的收益往往最大。
第 8 步:交叉验证,别信 OCR 认名字
- OCR 会把人名认错(形近字)。用学号数字、班级、序号位置交叉验证,并抽样目视核对 1–2 页版式与识别结果。
- PDF 正文顺序常被打乱(表格按单元格逐行输出),不要靠"相邻行"判断姓名归属,要看版式或截图确认。
常见坑
- 负面材料要单独提示,但一般不放提交材料:通报批评、差寝等扣分项会影响总分,用户可能只想要正面材料 —— 那就只放进"注意事项",不放进提交册,但必须明确告知扣了多少。
- "证书没过期" ≠ "材料没过期":证书终身有效,但发生时间可能落在统计区间外,或去年已报过(不重复加分)。要区分"证书有效期"和"综测统计区间"。
- 口径冲突:本次实施办法 / 旧学院办法 / 部门细则表三者数值可能不一致。以本次文件为准,用旧文件/细则表去争取更高档,并把差额与风险写清楚。
- .doc/.xls 老格式的"只读检索":不做结构化输出时,直接跑字节级搜索(中文在 Word97/BIFF8 里就是 UTF-16LE)最快。
但"要填表"时不能只读 —— 见铁律 0 的三个开关(OpenNoRepairDialog+FileValidation\EnableOnLoad=0+Save())。 - Word COM 会假死:① 文件沙箱挡了命名管道;② 前一次强杀的 Word 成了僵尸进程(先
Stop-Process);③ 崩溃恢复状态(删HKCU:\Software\Microsoft\Office\16.0\Word\Resiliency与%APPDATA%\Microsoft\Word\*.asd);④ 非只读打开带 WPS 私有流的 .doc(换OpenNoRepairDialog);⑤SaveAs2。
验证结果改用ComputeStatistics(2)/Tables.Count/InlineShapes.Count,不要用ExportAsFixedFormat导 PDF(会偶发卡死)。别把.xls丢给 Word 打开。 - 表格有纵向合并单元格时:
Table.Cell(r,c)和Rows.Item(r)都会直接抛「无法访问此集合中单独的行,因为表格有纵向合并的单元格」。
正确写法是遍历Table.Range.Cells,用cell.RowIndex+cell.ColumnIndex定位 —— 同一份模板里,四张分表的合并结构可能各不相同(实测德育分表能Cell(r,c),劳育/美育分表就不行)。 - 写 .ps1 必须存成 UTF-8 with BOM,否则 PowerShell 5.1 按 ANSI 读,中文全乱、语法报错。
- 图片要"一项一张":裁剪标注图(红框)留着,整页图删掉;原文件副本不必留。
- 一个加分项可能有多张证据(校级+院级、名单+依据条文),命名要能区分,清单里注明。
- 扫描件里的名单常常没有表头,别硬凑"第几列",改为描述相对位置。
输出物规范
<输出根目录>\
本次规则.md # ★ 从本次原文件抄出的规则(维度/公式/基本分/上限/原则/区间/门槛)
加分总表.md / .docx # 一条一行:维度 | 加分项 | 分值 | 分值依据 | 材料位置 | 证明图号
可加分证书清单.md # 反向清单:还有哪些证能加分、去哪找
待补与存疑.md # 无法溯源、缺依据、口径冲突、需用户确认的事项
<班级> <姓名> <学号>\ # ★ 严格照学院模板命名(含模板里的空格/分隔符),文件名与后缀照抄模板
德育\德育分表.doc 德育材料.doc ← 都是【学校原件的副本】,只往里填内容
劳育\劳育分表.doc 劳育材料.doc
美育\美育分表.doc 美育材料.doc
体育\体育分表.doc 体育材料.docx
四六级证明材料.doc
规则:
- 分表与材料文档 = 学校原件的副本 + 填进去的内容(铁律 0)。不要输出自制的
.docx顶替官方模板;
后缀也照抄模板(模板是.doc就交.doc,是.docx就交.docx)。 - 若用户同时需要"好看的汇总册",那属于附加物,另放一个
汇总(附加,非提交件)\目录,绝不与官方模板混在一起。 - 每条加分项必须写全:项目 / 分值 / 分值依据(文件+页码+条号) / 材料位置(文件+页码+行列或单元格) / 证明图号。
- 图片命名
<维度><序号>_<事项>[_证据类型].png;一项一张,含红框标注。 - 总分只有在
本次规则.md完整时才给;缺维度分值/公式就只给加分合计,并注明原因。 - 交付前必须把填好的官方文件用 Word 读回来核验(页数 / 表格行列数 / 图片数 / 抽样单元格文本),把核验结果贴给用户。
交付前自检(少一条都不算做完)
- 输出目录里,分表与材料文档的后缀、文件名与学校模板完全一致。
- 二者都是从原件复制的 —— 能说清原件的来源路径(本轮模板目录 / 上一轮同名目录 / 学院下发压缩包)。
- 原件目录没有被修改(对比修改时间或提前备份)。
- 每份填好的文件都能被 Word 打开,且表格行列数与原件一致(证明没有换掉模板)。
- 用
本次规则.md里的数字复算一遍合计,与分表里的合计一致。
必须向本人确认的问题(不要自己猜)
- 职位类(协会干部/班委/寝室长)的官方考核文件与考核等级(档位不同分值不同;任职折算比例看本次文件)
- 有争议证书的口径(本学院条文没点名时)
- 是否已有材料落在统计区间外、或去年已报过(不重复加分)
- 让他翻找自己的证书原件:计算机等级、无人机驾驶证、无偿献血证、校外实习证明、荣誉证书、六级成绩单
- 参加过的活动里,名单上没出现的(让他回忆,再去对应名单复核 / 找主办部门补名单)
scripts/
本 skill 附带的脚本,直接执行(不是参考):
| 脚本 | 用途 |
|---|---|
scripts/scan_pdf.py <root> <out.json> <关键词...> |
有文字层 PDF 全文检索 + 坐标(输出命中矩形,供裁剪) |
scripts/scan_office.py <root> <out.json> <关键词...> |
xlsx / docx(含全部 XML part)单元格级检索 |
scripts/scan_legacy.py <root> <out.json> <关键词...> |
.doc / .xls 字节级检索(UTF-16LE/GBK/UTF-8) |
scripts/render_pages.py <root> <imgdir> <index.json> [--image-only] |
渲染页面供 OCR;--image-only 只渲染图片覆盖率>45%的页 |
scripts/ocr_pages.ps1 |
Windows OCR 批量识别(env 传参:DSH_OCR_WORK/IDX/IMG/OUT/WATCH),输出含词级坐标的 JSON |
scripts/xlsread.py <file.xls> |
免 xlrd 的 CFB + BIFF8 解析器(含 SST/CONTINUE 处理) |
scripts/shots_lib.py |
PDF 命中处裁剪 + 红框 + 标注条;自动算行号列号 |
scripts/docxgen.py |
生成普通 .docx(表格/段落,严格 OOXML 元素顺序)——只用于附加汇总册,不得用来顶替官方模板(铁律 0) |
scripts/docxgen_img.py |
生成内嵌图片的 .docx(自建 rels/media/content-types)——同上,仅用于附加汇总册 |
scripts/fill_official_doc.ps1 |
★ 填官方模板:复制学校原件 → 只写它既有表格的单元格 / 追加图文 → Save()。参数:-SrcTpl <原件模板根> -Out <输出根> -Content <content.json> |
scripts/gen_content.py |
生成 content.json(分表要填的 [行,列,值] + 材料文档的图文条目)——填表内容与逻辑分离,改内容不用改脚本 |
依赖:PyMuPDF、openpyxl、Pillow;OCR 用 Windows 自带 Windows.Media.Ocr(需中文简体语言包),无需联网。
> reference.md 收录了某学院某学年的条文与分值,只用于识别"这类加分通常写在哪一节",不能作为分值依据(见铁律 1)。