XLS / DOCX 模板样式转换
将待处理文件(.xls/.xlsx 表格 或 .docx Word 题库)转换为与模板一致的样式,输出为新文件(工作表名默认 输出),原文件保持不变。表格路径与 Word 路径共用同一管线,下游的拆分/删列/对齐/扩展逻辑完全一致。
何时使用
- 用户说:"按这个模板整理一下这张表" / "把表头对齐到模板" / "把选项列拆开" / "删掉模板没有的列" / "把这份题库转成导入模板格式"。
- 用户给了一个 Word 题库 (.docx) 和一份导入模板,要求"把 Word 里的题按模板整理成表格"。
- 题库、问卷、导入模板类文件的结构化重排。
核心流程(按顺序执行)
- 分析模板:读取模板表首行,提取列名与顺序;用数字后缀正则
^(.*?)(\d+)$识别"选项组"(如选项1..4,前缀=选项,基准列数=4)。 - 分析源表:按扩展名分派。
- 表格源(.xls/.xlsx):读取首行与数据行。
- Word 源(.docx):调用parse_docx解析段落式题库,产出与表格源同构的中间行(列:题型,题目名称,选项,答案),再走同一管线。解析规则:- 章节标题为中文数字+
、(如一、判断题/二、单项选择题/三、多项选择题)决定当前题型;仅保留--docx-types指定的题型(默认单选题,多选题,判断题),其余章节整体跳过。 - 单选题/多选题:题干行(
数字、题干)→ 选项行(A.文本 B.文本可同行 tab 分隔或分行,亦支持与答案同行如...正确答案:A)→ 答案行(正确答案:X)。 - 判断题:题干与答案同行,答案以
(√)/(×)(含对/错、正确/错误等)结尾;映射为 A/B,并合成A.正确|B.错误选项。 - 选项内部记为
A.文本|B.文本,交由下游统一规范为X、内容。
- 章节标题为中文数字+
- 自动建列映射:
- 显式重映射:用户通过--rename 源=模板指定(多个逗号分隔)。
- 同名精确匹配(如答案→答案)。
- 同义词匹配:内置题库常见列名(题目名称↔题干/题目/问题,答案↔正确答案/标准答案等;见脚本顶部SYNONYMS)。
- 待拆分列:源列名去掉尾数字等于选项前缀(如选项)即判定为拆分列;否则回退到"分隔符分析"(统计| 、 ; ; \t哪个能把单元格稳定切成多段)。
- 兜底:若有且仅有 1 个模板单列 + 1 个未使用源列,做 1:1 自动配对。 - 展示方案并确认:先用
--dry-run打印转换方案(模板列、选项组、列映射、拆分列/分隔符、删除行条件、输出列、保留/删除/截断行数)。若存在无法自动配对的模板列,向用户确认或用--rename指定。 - 执行转换:
- 表头按模板列名与顺序对齐;选项组在原位置展开为选项1..N。
- 拆分列按分隔符(默认|)拆成多列,并把选项内分隔符规范为、(如A-人身→A、人身)。
- 删除模板未包含的多余列。
- 按--drop 列=值(如题型=简答题)删除整行。
- 选项列数按数据最大值动态扩展(默认开启,多选项题不再截断;--no-extend可关闭并截断多余项)。 - 校验:确认选项列均为
X、内容格式;答案为纯字母时,其字母集合应是选项字母的子集(无"答案指向缺失选项")。 - 缺陷题处理(Word 源):解析时若某题"答案引用的选项字母在本题选项中不存在"(如答案为
DC但只列了 A/B/C),判定为明显错误的答案(源文件数据缺陷)。默认行为:从输出表格中删除该题,并将其题干、选项、答案与说明写入一份单独的纯文字文件<输出文件同名>_缺陷说明.txt,不臆造补全。可用--keep-defective改为保留并跳过说明。 - 写出:新文件默认名为
<源文件名>_输出.xls,仅含工作表输出;原文件不动。若存在缺陷题,同时生成_缺陷说明.txt配套交付。
调用方式
依赖 xlrd / xlwt(脚本缺失时自动 pip install)。用任意 Python 3 运行 scripts/template_convert.py;优先使用 WorkBuddy 托管运行时(如 Windows 上 C:\Users\<user>\.workbuddy\binaries\python\versions\<ver>\python.exe),否则回退到 python3 / python。
# 表格源:先看方案(不写盘)
python3 scripts/template_convert.py --template 模板.xls --source 源.xls --drop 题型=简答题 --dry-run
# 表格源:确认无误后正式生成
python3 scripts/template_convert.py --template 模板.xls --source 源.xls --drop 题型=简答题
# Word 源:自动解析 单选/多选/判断,按模板生成(默认保留这三类的全部题目)
python3 scripts/template_convert.py --template 模板.xls --source 题库.docx
# Word 源:仅保留指定题型
python3 scripts/template_convert.py --template 模板.xls --source 题库.docx --docx-types 单选题,多选题
# Word 源:答案明显错误的题默认删除并出单独文字说明;如需保留则:
python3 scripts/template_convert.py --template 模板.xls --source 题库.docx --keep-defective
完整参数说明见 references/usage.md。
注意
- 模板选项组仅支持单一前缀(最常见的
选项N形态)。 - 同义词表为常见题库用语,覆盖不到的列名用
--rename显式指定。 - 中文题库常见陷阱:选项内分隔符可能是
-而非、、简答题行选项列为\占位、存在 5 选项题——本技能均已处理。 - Word 源特定:
- 判断题不列选项,脚本固定合成
正确/错误两个选项,答案√/×映射为A/B。 - 章节标题需为中文数字+
、开头;若 Word 用其他分节方式(如纯文本标题),需先规整或手动指定。 - 若源 Word 中答案引用的选项字母在题干选项里缺失(如答案为
DC但只列了 A/B/C),属源文件数据缺陷:默认删除该题并以单独_缺陷说明.txt文字说明(含题干/选项/答案/原因),不臆造选项文本;--keep-defective可改为保留。