尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

教师资格证试讲教案模板:python-docx和docxtpl批量生成校验

教师资格证试讲教案模板:python-docx和docxtpl批量生成校验 简介这份文档是广西高校教师资格证试讲环节使用的教案模版面向准备参加高校教师资格认定试讲的高校教师与应届毕业生帮助解决试讲教案不知如何规范撰写、环节如何排布的问题。全文以电子商务专业「第七章 电子支付」为示例课题依次给出课题、学科、授课教师、单位等表头项以及教学目的与要求、教学重点与难点、教学方法、使用教材和主要参考书、教学过程等完整栏目内容涉及电子支付与电子货币的含义、储值卡与银行卡及信用卡的功能、虚拟货币、网上银行和第三方支付平台等知识点并配有案例引入与课时分配痕迹可直接对照修改。资源为单个doc文件压缩包约219KB结构完整、便于打印与二次编辑目前已有72人学习下载适合作为试讲备课的框架参考与格式范本。1. 广西高校教师资格证试讲教案模版.doc 到底该装什么面试前一周最常见的场景是从学长那里要来一份广西高校教师资格证试讲教案模版.doc把课程名一改字号、行距、表格列宽全乱了改完三份不同学科的教案格式已经各不相同。省时间的做法是把这份模版当成一份有字段定义、有样式约束的文档而不是一份可以随手覆盖的稿子。试讲环节评委在十几分钟里要判断的是「目标—过程—评价」能不能闭合教案把这个闭环摆清楚、格式统一就已经赢过一大半人。接下来的路数适合三类人马上要试讲的考生、替教研室整理统一模版的老师以及被安排写文档自动化脚本的 IT 从业者——用 python-docx 和 docxtpl 把一份 Word 模版变成可批量套打、可自动校验的数据驱动产物。2. 拆解试讲教案模版的字段结构从教学目标到板书设计的表格化建模把模版用起来之前先要回答一个问题哪些内容是「字段」、哪些是「版式」。字段是可以从数据里填进去的版式是在 Word 里一次调好、之后不再动的。分不清这两者就会出现「每换一个学科都要重新调一遍表格」的局面。下面先把字段清单固定下来再用脚本把现有 .doc 的骨架读出来验证。2.1 试讲教案必备字段与面试评分点的对应关系教案的字段顺序应当跟说课逻辑一致先说清教什么、教给谁再说怎么教、教完怎么检验。下表是可以在绝大多数广西高校试讲场合直接复用的字段集。字段评委关注点常见写法篇幅建议课程名称 / 授课对象教案与试讲内容是否对得上用课程全称不写简称一行教学目标知识、能力、素质三维是否写全三维分行动词开头能说明、能实现、能分析60100 字教学重点与难点重点和难点是否分开写重点 12 条难点 1 条4080 字教学方法与手段除讲授外有没有互动设计讲授法、案例法、演示法 信息化手段3060 字教学过程环节是否完整、时间是否分配导入—讲授—互动—小结—作业400700 字板书设计是否与讲授主线一致用表格画版面别用大段文字描述版面示意图教学反思是否留了可写的空间留 35 行空白现场手写空白参考资料版本信息是否完整教材名 作者 出版社一行提示教学目标一栏最容易被写成「让学生了解 XX」这类无法检验的句子。换成「能画出 XX 的状态转移图」「能说明 XX 与 YY 的差异」评委一眼就能看出目标可评价。2.2 用 python-docx 读出现有模版的段落与表格骨架2.2.1 先把 .doc 转成 .docxpython-docx 只认 OOXML也就是 .docx老版 .doc 必须转换。Windows 上最稳的是用 Word 另存为Linux 或者服务器上一般走 LibreOffice 命令行# --headless 不弹界面--convert-to 指定目标格式--outdir 指定输出目录 soffice --headless --convert-to docx --outdir ./converted 试讲教案模版.doc转换后一定要打开比对一次。常见差异是文本框里的内容会掉出来变成普通段落页眉页脚里的横线会丢。如果模版本身大量使用文本框排版直接重做一个 .docx 反而比修补转换结果快。2.2.2 按文档流顺序遍历段落与表格doc.paragraphs和doc.tables是两个独立列表分别遍历会丢失「段落和表格谁在前」的信息。要还原真实骨架得走底层 XMLfrom docx import Document from docx.table import Table from docx.text.paragraph import Paragraph from docx.oxml.ns import qn def iter_block_items(parent): 按文档流顺序依次产出段落和表格便于比对模版骨架 body parent.element.body for child in body.iterchildren(): if child.tag qn(w:p): yield Paragraph(child, parent) elif child.tag qn(w:tbl): yield Table(child, parent) doc Document(试讲教案模版.docx) for i, block in enumerate(iter_block_items(doc)): if isinstance(block, Paragraph): if block.text.strip(): print(f[P{i}] 样式{block.style.name} | {block.text.strip()[:40]}) else: print(f[T{i}] 表格 {len(block.rows)}行 x {len(block.columns)}列 f| 首格{block.rows[0].cells[0].text.strip()})逻辑说明iter_block_items直接遍历w:body下的子元素w:p是段落、w:tbl是表格二者的先后顺序就是你在 Word 里看到的顺序。参数说明qn(w:p)把简写标签展开成带命名空间的完整标签不写命名空间判断恒为假。输出里[T]开头的行就是需要保留为版式的部分[P]开头的行是需要改成占位符的部分。2.3 把字段定义成 YAML一份数据对应一份教案确定字段后把内容抽到 YAML 里模版只保留结构。这样做的好处是同一个模版可以喂给不同学科备课内容改起来也不必再开 Word。meta: course: 数据结构与算法 audience: 计算机科学与技术专业二年级 hours: 1 课时45 分钟 textbook: 严蔚敏《数据结构》C 语言版 objectives: knowledge: 能说明栈的后进先出特性及其在表达式求值中的作用 ability: 能用 C 语言实现一个基于数组的顺序栈 quality: 能在调试中形成先定位边界条件的排查习惯 key_points: [栈的存储结构, 入栈出栈的边界判断] difficult_points: [栈满与栈空的判定条件区分] methods: [讲授法, 案例演示法, 课堂练习] steps: - {stage: 导入, minutes: 3, content: 用浏览器后退按钮引出后进先出} - {stage: 讲授, minutes: 20, content: 顺序栈的结构体定义与两个基本操作} - {stage: 互动, minutes: 12, content: 学生上机实现入栈并观察栈满时的返回值} - {stage: 小结, minutes: 5, content: 对比顺序栈与链栈的取舍} - {stage: 作业, minutes: 5, content: 用栈判断括号匹配}参数说明steps用列表而不是字典是因为教学过程的顺序本身有意义YAML 列表保序字典在部分解析器里不保证。minutes单独成字段后续可以写一段脚本校验各环节时间之和是否等于课时这是评委最容易挑的硬伤之一。3. 用 python-docx 生成符合规范的教案正文样式、表格与中文字体模版的观感八成取决于三件事中文字体有没有设对、表格列宽稳不稳、页面尺寸是不是 A4。这三件事都不在内容里却最容易在打印或投影时翻车。3.1 中文字体与字号设置的两个陷阱第一个陷阱是run.font.name只作用于西文。Word 把字体拆成 ascii、hAnsi、eastAsia 三套中文字符认的是 eastAsia。只设font.name结果是数字和字母变成了 Times New Roman汉字还是默认字体。from docx.shared import Pt from docx.oxml.ns import qn def set_run_font(run, cn宋体, enTimes New Roman, size12, boldFalse): 同时设置西文与中文字体避免出现西文生效、汉字不生效 run.font.name en # ascii 与 hAnsi run.font.size Pt(size) run.bold bold rpr run._element.get_or_add_rPr() rpr.rFonts.set(qn(w:eastAsia), cn) # 关键汉字字体第二个陷阱是字号与「号数字号」的换算。教案里说的是「正文小四、表格五号」代码里要用磅值。中文字号磅值教案里的典型用途小三15教案首页大标题四号14一级栏目名教学目标、教学过程小四12正文、教学目标条目五号10.5表格内文字小五9页脚、参考资料注意整篇教案的字号种类控制在三种以内超过三种在投影上看就是「排版在抢内容」。3.2 页面设置与课程信息表的固定列宽页面尺寸用 EMU 作为内部单位Cm()只是换算包装。A4 去掉左右各 3.17 厘米的页边距正文宽度正好 14.66 厘米表格列宽之和超过这个值就会被挤到下一页。from docx import Document from docx.shared import Cm from docx.enum.table import WD_TABLE_ALIGNMENT doc Document() sec doc.sections[0] sec.page_width, sec.page_height Cm(21.0), Cm(29.7) # A4 sec.left_margin sec.right_margin Cm(3.17) sec.top_margin sec.bottom_margin Cm(2.54) info doc.add_table(rows2, cols4) info.style Table Grid info.alignment WD_TABLE_ALIGNMENT.CENTER info.autofit False # 关掉自动调整否则列宽会被内容顶开 keys [课程名称, 授课对象, 课时, 教材] vals [数据结构与算法, 计算机科学与技术专业二年级, 1 课时45 分钟, 严蔚敏《数据结构》] for j, (k, v) in enumerate(zip(keys, vals)): info.cell(0, j).text k info.cell(1, j).text v widths [Cm(2.6), Cm(5.4), Cm(2.6), Cm(4.0)] # 合计 14.6cm留一点余量 for row in info.rows: for j, w in enumerate(widths): row.cells[j].width w参数说明autofit False必须写在设置列宽之前否则 Word 打开时会按内容重新分配宽度。widths逐单元格设置而非整列设置是因为 python-docx 的column.width在合并单元格存在时不可靠。3.3 教学过程表与教学环节的编号方式教学过程表常见的五列是教学环节、教学内容、教师活动、学生活动、时间分配。列宽建议按 2:5:3:3:2 分配时间分配列窄一点评委扫一眼就能对上总时长。教学环节的编号建议直接手写前缀「1. 导入3 分钟」不要用 Word 的自动编号。提示自动编号是域在 WPS、Pages 或转 PDF 时可能不刷新出现「1. 1. 1.」或者编号粘连。教案要在陌生环境里打开手写前缀最省事。板书设计同样建议用表格而不是图片。用两三个合并单元格画出主板书区、副板书区评委在原尺寸文档里能看到你在讲什么图片在缩放后会糊。4. 用 docxtpl 批量套打多学科教案模板占位符与数据驱动python-docx 适合从零生成但只要模版里有一点复杂版式页眉、页脚、带边框的表格从零写的代码会长得难以维护。这时候换成 docxtpl在 Word 里把模版改好代码只负责填空。4.1 在 .docx 里写 Jinja2 占位符的规则与坑普通变量用{{ course }}表格行循环用{%tr for s in steps %}。tr前缀表示整行docxtpl 会把这一行删掉再按数据条数复制。最大的坑是占位符被拆散。Word 会把一次输入的文本按编辑历史拆进多个w:r元素{{ course }}一旦被拆成{{和course }}两段Jinja2 解析就会报语法错误。典型触发场景是输入占位符后又单独改了其中几个字的字体或颜色。修复办法是在 Word 里选中整个占位符删掉重新一次性输入。模板行位置单元格内容循环行第 1 格{%tr for s in steps %}循环行第 25 格{{ s.content }}、{{ s.teacher }}、{{ s.student }}、{{ s.minutes }}循环行的下一行第 1 格{%tr endfor %}4.2 批量生成多学科教案的脚本import yaml from pathlib import Path from docxtpl import DocxTemplate DATA Path(data) # 每门课一份 YAML OUT Path(out) OUT.mkdir(exist_okTrue) for f in sorted(DATA.glob(*.yaml)): ctx yaml.safe_load(f.read_text(encodingutf-8)) # 每轮重新载入模版避免上一轮替换结果被累积进来 tpl DocxTemplate(试讲教案模版.docx, autoescapeFalse) tpl.render(ctx) name f{ctx[meta][course]}-试讲教案.docx tpl.save(OUT / name) print(生成, name)逻辑说明DocxTemplate的实例有状态同一个实例连续render会把上一轮的上下文残留下来表格行循环尤其明显——第二轮生成出来的表格会带着第一轮的行。所以放在循环体内重新构造。参数说明autoescapeFalse关掉 HTML 转义教案正文里出现AB、T、泛型尖括号这类符号时不会被转成实体。4.3 表格行循环与可选段落的处理教学过程的环节数量每门课都不一样导入、讲授、互动、小结、作业五段是常规但有的课没有上机互动。数据里直接不写这条{%tr for %}自然就不会渲染该行不需要在模板里加if。真正需要条件渲染的是「教学反思」这种整块可选内容。给整段套上{% if reflection %}与{% endif %}段落级标签必须独占一行写在段落中间会导致整段被切碎。渲染完的文件建议再跑一次第 2 章的iter_block_items确认表格行列数和预期一致一行命令就能挡住大部分批量生成事故。5. 交付前的自动校验与导出字段完整性检查、PDF 转换与页码技巧批量生成最容易出的问题不是脚本报错而是脚本不报错、文件打开才发现某门课的「教学重点」是空的。交付前加一道自检最划算。5.1 必填字段与时间分配的自检脚本from docx import Document from pathlib import Path REQUIRED [课程名称, 教学目标, 教学重点, 教学过程, 板书设计] for p in sorted(Path(out).glob(*.docx)): doc Document(p) text \n.join(x.text for x in doc.paragraphs) for t in doc.tables: # 表格文字不在 paragraphs 里 for row in t.rows: text \n \t.join(c.text for c in row.cells) miss [k for k in REQUIRED if k not in text] if miss: print(p.name, 缺字段:, miss)逻辑说明python-docx 的paragraphs不包含表格内的文字必须单独遍历doc.tables否则「教学过程」这种整块都在表格里的字段会被误判为缺失。重点检查的是「教学重点」和「板书设计」这两项最常因为数据里忘了写而空着。5.2 转 PDF 与页脚页码打印稿通常要求 PDF。LibreOffice 可以批量转soffice --headless --convert-to pdf --outdir out/pdfs out/*.docx转换完成后一定要抽查两页一是表格有没有跨页断开二是页码有没有正确显示。页码靠页脚的 PAGE 域python-docx 没有直接 API需要写入域代码。如果嫌麻烦更稳的做法是在模版 .docx 的页脚里预先放好页码域批量生成时不去动它。最后提醒一句同一份教案在 Word 和 WPS 里的分页位置可能差一两行确认版式时用你面试现场真正会打开的那个软件。本文还有配套的精品资源点击获取
返回列表