
简介面向医疗信息化与临床记录场景这份压缩包汇集了电子病历EMR常用模板适合医疗机构科室、基层门诊、健康管理机构以及需要建立个人健康档案的用户使用。模板覆盖患者基本信息、既往史与家族史、体格检查、实验室检查、影像学资料、诊断结论、治疗方案以及费用记录等关键模块涵盖从接诊、检查到治疗与随访的主要记录节点有助于规范病历书写、减少遗漏同时为后续数据统计和系统集成打下基础。压缩包整体约477KB以rar格式存放便于快速下载与按需筛选目前已有589人学习下载适合医学信息管理、临床文档标准化及EMR系统建设相关从业者参考。通过这套模板可以快速搭建符合日常流程的病历框架既支持院内电子病历的落地实践也方便个人留存完整诊疗记录提升医疗服务的准确性与可追溯性。1. 电子病历模版集合 rar不是拿来就能用的模板是一套待整理的半成品一个叫「电子病历模版集合.rar」的压缩包解压后是几十上百个 doc。很多医院信息科和乙方实施人员拿到这种包的第一反应是直接丢进 EMR 系统让临床科室按这个格式写病历。这个思路从一开始就错了。这类模板包的价值不在文件数量而在你愿意花多少功夫把它从「一堆文档」变成「一套受控资源」。我处理过的病历模板包里面通常是门急诊病历、入院记录、病程记录、手术记录、护理记录、知情同意书混在一起命名不统一排版残留大量空行有的还带着「【待补充】」占位提示。直接上线轻则字段对不上、质控漏项重则医生第一天就集体退回。这套流程要解决的正是这个问题拿到 rar 之后怎么拆、怎么整、怎么转结构化、怎么避坑最终让这套模板能被 HIS 真正用起来。适合谁读医院信息科工程师、电子病历实施顾问、负责病历质控的人员以及刚接手医院项目的乙方研发。后面所有操作以「你能碰命令行、能改脚本」为前提先把不依赖厂商私有系统的通用流程跑通。2. 打开模板包先做文件体检目录解压、编码识别和格式归一拿到 rar 先别急着双击解压。我一般会先在命令行里解压并生成文件清单这一步花十分钟能省掉后面两天排查命名冲突的力气。2.1 用命令行解压并生成文件清单先看家底再看内容常见做法是把 rar 解压到一个独立目录然后立即把文件清单落盘。这样做的好处是后续所有整理动作都有据可查而不是靠资源管理器肉眼翻目录。mkdir -p ./emr_templates unrar x -o 电子病历模版集合.rar ./emr_templates/ cd ./emr_templates find . -type f \( -name *.doc -o -name *.docx -o -name *.wps \) | sort file_list.txt wc -l file_list.txtunrar x是解压并保留目录结构-o表示遇到同名文件直接覆盖如果你不确定包内是否有重名文件第一次解压时把-o换成-o-碰到同名会跳过并提示这样就不会让后一个版本悄悄盖掉前一个版本。find同时匹配doc、docx、wps三种后缀是为了把 WPS 时代的旧模板也纳入统计。sort会把文件名按字节序排列方便我们一眼看出同一类文书到底有几个版本。注意第一次解压建议用-o-宁可让同名文件卡住也不要让老版本被新版本覆盖后还浑然不知。清单生成后我还会顺手统计一下文件大小分布把 0 字节和小于 1KB 的文件单独挑出来。这类文件九成是坏的不值得进入后续流程。find . -type f -size -1k | grep -E \.(doc|docx|wps)$这里-size -1k表示小于 1KBgrep再过滤一次后缀。看到输出后不要急着删先对照原始 rar 确认这些文件在压缩包内是否本身就是空壳。压缩包里的空文件往往意味着拷贝源就坏了保留原始包做证据比自行修复更稳妥。2.2 模板文件的三类健康问题损坏、加密残留与同名版本冲突文件清单出来后我会集中检查三类问题这也是模板包最容易翻车的三个地方。第一是文件损坏。除了上面按大小筛出的空壳还有一种情况是 doc 文件头被破坏Word 打开时报「文件已损坏」但文件大小正常。排查办法是直接用file命令看文件头file ./内一科/入院记录.doc正常 doc 会输出CDF V2 Document或Composite Document File V2之类的结果如果输出data说明文件头不对大概率是磁盘坏道或传输中断造成的。遇到这种文件直接放弃不要花时间修复模板集合里同一份文书往往有别的版本。第二是加密残留。有些模板包来源于科室共享盘既往人员为了保护文档设置了打开密码解压后打开才发现要密码。这时可以用 LibreOffice 配合--password参数批量打开确认但更快的办法是做好登记凡是打不开的加密文档一律退回给提供方要密码不要自行破解。第三是同名版本冲突。病历模板迭代非常频繁「入院记录最终版」「入院记录新」这类命名几乎每个包里都有。用 MD5 聚类可以快速看出哪些文件虽然名字不同、内容完全相同哪些是同一名字不同内容import hashlib, os from collections import defaultdict def md5(path): h hashlib.md5() with open(path, rb) as f: for chunk in iter(lambda: f.read(65536), b): h.update(chunk) return h.hexdigest() groups defaultdict(list) root ./emr_templates for dirpath, _, files in os.walk(root): for name in files: if name.lower().endswith((.doc, .docx, .wps)): full os.path.join(dirpath, name) groups[md5(full)].append(full) for digest, paths in groups.items(): if len(paths) 1: print(digest, len(paths)) for p in paths: print( , p)这段脚本会打印出内容完全相同的文件组。看到同一份「入院记录」出现在三个目录就知道这个包的真实模板种类比文件名显示的要少得多。相同内容的文件保留一份以目录层级最规范的那个为准其余归档到_archive/目录别直接删医院环境里任何删除操作都要留后路。2.3 把 doc 统一转成 docx为后续结构化解析打好地基体检完成后下一步是把所有能打开的 doc 转成 docx。原因很简单python-docx 等工具链对 docx 的解析是标准化的而老式 doc 是二进制格式第三方库的兼容性参差不齐处理起来像拆黑匣子。转换常见做法是用 LibreOffice 的命令行模式免费且支持批量mkdir -p ./docx_converted soffice --headless --convert-to docx --outdir ./docx_converted ./emr_templates/**/*.doc--headless表示不启动图形界面--convert-to docx是目标格式--outdir指定输出目录。注意这里用了**通配符需要 bash 开启globstarshopt -s globstar否则只能转换当前子目录的 doc。转换完成后对照file_list.txt检查输出数量确认没有文件被悄悄跳过。转换不是万能的。带复杂域代码、旧式书签、VBA 宏的 doc转出来的 docx 可能丢布局。所以我一般会把转换后的 docx 放进一个单独的docx_converted目录和原始 doc 分开存放后续所有结构化解析都基于转换后的 docx原始 doc 只作版式对照。这一步做完模板包才算从「能打开的文档」变成「能处理的素材」。3. 把 Word 模板转成 HIS 结构化模板解析段落、表格与占位符模板包里的 Word 文档再规范也只是一堆排版良好的文档。HIS 系统真正需要的是把每个标签映射到数据元的「结构」。这一章说清楚从 Word 到结构化 JSON 的完整路径。3.1 为什么不能直接挂 WordHIS 需要的是结构不是排版很多实施人员被临床科室逼着「把模板做成 Word写完再转 PDF 归档」这其实是把电子病历做成了电子打印病历。结构化电子病历要求病程记录里的「体温」「脉搏」「主诉」分别是独立字段能被质控规则读取、能被评级检查追溯而不是一段不可拆分的文本。直接挂 Word 的代价在事后才显现病历质控要统计「入院记录 24 小时内完成率」如果「入院记录」是一整个 Word 文档系统根本不知道它什么时候完成要查「主诉是否与现病史重复」Word 文本也拆不出字段。所以这一章的核心不是教你把 Word 转成 PDF而是把 Word 里的版式转成「块」和「字段」让 HIS 能消费。给个具体的结构化定义一段文本「主诉咳嗽、咳痰 3 天」要拆成label主诉、value咳嗽、咳痰 3 天一个表格式的「入院情况」要拆成表头和数据行。后面评级、质控、科研数据抽取全依赖这个结构。3.2 用 python-docx 提取段落和表格生成结构化 JSON我常用的解析工具是python-docx它能把 docx 的段落和表格按文档顺序读出来。下面是提取脚本的核心部分from docx import Document import json, re LABEL_RE re.compile(r^([^:]{1,20})[:]\s*(.*)$) def extract_blocks(docx_path): doc Document(docx_path) blocks [] # 逐段解析空段跳过有冒号的行拆成 label/value for p in doc.paragraphs: text p.text.strip() if not text: continue m LABEL_RE.match(text) blocks.append({ type: line, label: m.group(1) if m else , value: m.group(2) if m else text, }) # 表格逐行转二维数组供后续处理合并单元格 for t_idx, table in enumerate(doc.tables): rows [] for row in table.rows: cells [c.text.strip() for c in row.cells] rows.append(cells) blocks.append({type: table, index: t_idx, rows: rows}) return blocks if __name__ __main__: data extract_blocks(入院记录.docx) with open(入院记录.json, w, encodingutf-8) as f: json.dump(data, f, ensure_asciiFalse, indent2)LABEL_RE这个正则只匹配「一到二十个非冒号字符 冒号 内容」基本覆盖「姓名张三」「既往史无」这类病历行。如果一个段落没有冒号就把整段作为无标签文本放进 value比如病程记录里的整段叙述性文字。表格部分用table.rows逐行读row.cells会返回该行所有单元格文本。注意一个坑合并单元格在 python-docx 里会被重复返回为对同一_Cell对象的引用所以后续写数据库时要先做去重否则同一格内容会被写入多个列。注意生成 JSON 之后不要急着删 Word。这个 JSON 只用于字段映射和结构检查真正给医生用的模板仍以 Word 或系统表单形式存在。JSON 的意义是让我们能用脚本批量比对「模板结构是否缺项」而不是替代编辑界面。3.3 字段映射把「姓名」换成 HIS 数据元 codeJSON 里的 label 还是中文送入系统前需要映射成 HIS 的数据元标识。这个映射关系通常做成一张表我一般建议直接维护一个 CSV而不是写在代码里模板标签数据元 code数据类型必填说明姓名PAT_NAMEstring是患者姓名性别PAT_SEXdict是字典项男/女/未知出生日期PAT_BIRTHdate是格式 YYYY-MM-DD主诉CHIEF_COMPLAINTtext是自由文本限制 50 字现病史PRESENT_ILLNESStext是自由文本体温VITALS_Tnumber否单位 ℃映射的逻辑很简单模板里出现「姓名」的地方一律替换为PAT_NAME的{{PAT_NAME}}占位符。下面这段代码读取上面 CSV 做替换import csv, re, json def build_map(csv_path): mapping {} with open(csv_path, encodingutf-8-sig) as f: for row in csv.DictReader(f): mapping[row[模板标签]] row[数据元 code] return mapping def replace_labels(blocks, mapping): for b in blocks: if b[type] line and b[label] in mapping: code mapping[b[label]] b[code] code b[value] re.sub(r\{\{\w\}\}, {{ code }}, b[value]) return blocksbuild_map从 CSV 读映射utf-8-sig是为了兼容 Excel 另存 CSV 时带 BOM 的情况。替换时用re.sub把已经存在的{{旧code}}统一改成新 code实现幂等处理。映射完成后用一段校验逻辑把「模板里出现但映射表里没有」的 label 打印出来这些就是要找临床确认的新增字段。字段映射是整个落地过程中最枯燥但最关键的一步。映射漏一个字段评级检查时对应的数据项就是空的映射错一个类型质控规则会把「体温 36.5」当成文本去比较。我见过团队在这一步省事直接把整个段落作为一个大字段入库最后统计「主诉是否超过 20 字」都做不了。3.4 表格类模板的处理合并单元格与重复表头病历里有大量表格比如体格检查表、手术风险评估表。处理表格类模板时我通常会先做两件事去重合并单元格处理重复表头。def clean_table(rows): cleaned [] for row in rows: seen set() new_row [] for cell in row: # 横向合并单元格在 python-docx 中会重复出现 # 用 (文本, 长度) 做近似去重纵向合并需另处理 key (cell, len(cell)) if key in seen: continue seen.add(key) new_row.append(cell) cleaned.append(new_row) return cleaned这段去重代码属于近似方案对横向合并的单元格有效对纵向合并的单元格上一行出现的文本在下一行再次出现时也可能被误去重。如果同一行里有两列内容完全相同的合法数据这个近似方案同样会误删需要结合坐标判断。所以更可靠的做法是直接读 XML 里的gridSpan和vMerge属性但这属于把 python-docx 的抽象层捅破只有在模板必须完整保真的场景才值得做。绝大多数场景下近似去重加人工抽检已经够用。重复表头的问题出现在「首诊记录」「续页」这类分页表格里。模板作者为了打印美观往往在每页都加表头。结构化入库时这些重复表头必须去掉否则查询结果会出现一排空的「项目名称」。处理办法是按内容判断当一行的单元格内容与第一行表头完全一致时丢弃该行。注意先把表头字段名本身存好再去匹配。4. 模板库分级与命名规范让内科、外科和评级检查都不打架结构化的 JSON 做出来后模板还是一份一份的散件。这一章讲怎么把它们组织成一套能长期维护的模板库。4.1 一套模板包要拆成四层全院级、专科级、操作级和个人级我见过的失败案例大多是所有模板平铺在一个目录里没有层级概念。结果内科护士调用入院记录选中的却是外科的版本因为按修改时间排序外科那份排在前面。实际落地时我一般建议分成四层每层的审批权限不同层级适用范围示例修改权限全院级所有科室通用入院记录、出院记录、病危通知书医务处/质控办专科级特定科室专用产科待产记录、ICU 镇静评估表科室主任操作级特定检查/手术/治疗冠状动脉造影知情同意书、CT 增强同意书操作科室个人级医生个人草稿个人常用段落、个人签名模板个人这四层之间是覆盖关系医生写一份入院记录最终生效的模板由「全院级 当前科室专科级」合并而成。个人级只能加内容不能覆盖全院级已经定义好的字段否则质控规则会绕过去。分级的意义不只是权限还关系到模板冲突的判定。同一份「入院记录」全院级定义了第一段「患者一般情况」外科想加一个「术前诊断」这个补充只能出现在外科专科级里而不是直接改全院级。这样内科调用的版本永远不会被外科的修改连累。4.2 命名规则科室_文书类型_版本号_启用日期杜绝「最终版」地狱模板包里的命名混乱基本是「最终版」「改改版」「新新新」这类后缀造成的。我这边定过一条硬规则文件名必须是科室_文书类型_版本号_启用日期日期格式 YYYY-MM-DD。合法示例心血管内科_入院记录_v2.4_2024-05-01.docx非法示例心内入院记录最终版(3).docx、入院记录新.docx版本号规则也值得一提主版本号在结构变更时递增次版本号在文字修正时递增。「入院记录」从三段式改成两段式是 2.3 到 3.0只是把「联系电话」从选填改成必填是 2.3 到 2.4。启用日期是模板正式生效的日期不是文件修改日期。这样设计的好处是评级检查时拿出科室_文书类型_版本号_日期的清单评审员一眼就能看出模板是不是受控版本。配合命名规则还要有一份注册表。通常是一张 Excel 或在线表格记录「模板 code、名称、版本、生效日期、失效日期、归属科室、负责人」。模板 code 和文件名的「科室_文书类型」部分保持完全一致后续 HIS 导入时直接以 code 作为唯一键。这个注册表是整个模板库的事实源比文件名更可靠。4.3 把模板映射到电子病历评级指标每个模板都要回答「评审问什么」医院投入整理模板集合多半是冲着电子病历应用水平分级评价去的。评级条目虽然各年份口径有差异但核心检查点不外乎三点模板是否受控、文书是否结构化、数据能否在业务系统之间复用。受控这一点前面两节的分级和命名已经覆盖。结构化这一点第三章的 JSON 方案已经覆盖。数据复用这一点可以靠「每个模板的字段必须能对应字典」来保证。比如「入院途径」只能取「门诊、急诊、其他医疗机构转入」等字典值不能自由文本「手术切口等级」必须关联手术字典。评级检查时评审员往往会直接点开一条病历看某个结论字段到底是可统计的结构化值还是一段打字自由文本。批量检查模板里是否存在未绑定字典的自由文本字段可以用之前的blocksJSON 做一次扫描import json dict_expected [入院途径, 医疗付费方式, 手术切口等级, 血型] with open(入院记录.json, encodingutf-8) as f: blocks json.load(f) for b in blocks: if b.get(label) in dict_expected and not b.get(code): print(f字段 {b[label]} 未绑定数据元评级时可能被视为自由文本)这个脚本的意义是把「评级准备」从评审前的临时加班变成模板上线前的日常检查。跑出来的每个字段要么去字典表补充映射要么在模板库里标注「本字段按自由文本管理」。后者不是不行但要能讲出理由。5. 电子病历模板落地避坑五个高频翻车现场与处理办法模板集合从整理到真正上线中间全是坑。这一章列五个我反复遇到的翻车现场按「现象 → 原因 → 解决」写照着排查能省不少时间。5.1 翻车现场一模板里残留「【待补充】」直接进了正式病历现象医生打开模板写病历段落里出现大段的「【待补充】」「【待填写】」忘记删就直接提交。质控抽检时发现正式病历里带着这句话被医务处通报。原因模板包里的 Word 通常是业务科室给信息科整理的作者为了标注占位会写「【待补充过敏史】」之类。整理时如果只做排版清洗不做关键词检查这些占位文本就会原样保留到模板里。解决在模板导入 HIS 前用脚本全量扫描一遍所有 docx 文本把带「待补充」「待填写」「待完善」的行全部打出来人工确认。扫描脚本很简单基于第三章的extract_blocks即可grep -rl 待补充\|待填写\|待完善 ./docx_converted/grep -rl列出包含这些关键词的文件\|是基础正则的多选分隔写法。扫描出的内容有两种处理删除占位文本让该字段留空或者替换成系统级提示「字段由医生填写」绝不能让提示文本存在于默认模板里。上线后还要在质控规则里加一条「病历文本不得含待补充类关键词」作为兜底。5.2 翻车现场二合并单元格被拆成碎片结构化数据全乱了现象体格检查表是一个多行多列的合并表导入 HIS 后同一行的「肝脾」和「腹部」对不上数据串位导入数据库后合并单元格的内容出现在错误列。原因第三章代码里提过python-docx 对合并单元格会返回同一个_Cell对象但很多实施团队用的是自己写的 XML 解析把每个w:tc当成独立单元格导致合并单元格被拆成多个空列。解决尽量用成熟库处理如果走了原生 XML必须手动处理gridSpan和vMerge。我一般会写一个专门的校验收视脚本把解析后的二维数组打印成表格贴到文档评审群里让临床医生逐个核对「这一列的内容是否和原表一致」。人工核对听起来土但表格类模板的结构化准确率靠自动化测试反而不如医生一眼看得快。5.3 翻车现场三全院一张模板外科和内科的文书互相踩脚现象全院共用一个「手术记录」模板内科医生写非手术操作记录时系统仍要求填「手术者」「麻醉方式」导致内科病历无法提交而外科医生觉得「术后情况」栏位太少。原因模板整理时贪图省事把同类文书合并成一个没有做科室级拆分。解决按第四章的分级规则把「手术记录」拆成全院通用版和专科定制版。外科版本保留「手术者、麻醉方式、失血量」内科版本把「手术操作」改成「操作名称、操作者、操作时间」并去掉麻醉字段。特别注意拆版之后HIS 的模板选择器要按科室过滤否则内科医生依然能选到外科版。我见过拆了版但没配过滤规则的等于白拆。5.4 翻车现场四模板升级后历史病历版式错乱现象模板 v2.3 上线一个月后v2.4 把「联系电话」从选填改成必填并调整了段落顺序。医生打开此前保存的历史病历发现格式全乱有的字段跑到页面外。原因HIS 的住院病历往往是「模板 病历实例」结构实例保存了模板当时的版本标识。一旦模板升级且字段顺序变化旧版本实例试图套用新模板渲染时就会错乱。解决升级模板时必须保留旧版本模板而不是覆盖。HIS 里对每个模板版本做唯一标识病历保存时绑定该标识。打印和回放都用绑定的旧版本只有新建病历才用新版本。整理模板集合时也要养成「每次改动存为新版本文件旧文件归档」的习惯。第四章的命名规范里版本号就是干这个用的。5.5 翻车现场五带宏的模板在终端打不开或触发安全拦截现象模板文件里有 VBA 宏比如自动生成当前日期、自动计算年龄从 rar 解压出来分发给医生后部分终端的安全策略直接拦截双击提示「已阻止此文件打开」。原因文档宏在电子病历环境里本来就是高风险项。医院终端普遍装了文档安全管控宏被认定有脚本行为就会拦截。而且宏在不同 Office 版本间的兼容性很玄学在 Windows 10 上好的宏换到 Windows 11 就不触发。解决模板集合进入 HIS 之前统一去掉宏。日期、年龄这类动态值由 HIS 的字段计算实现而不是靠 Word 宏。去宏的批量处理可以用 LibreOffice 转换时的默认行为转换 docx 会丢弃宏但稳妥起见我会在整理环节直接打开检查一遍「文件 → 信息 → 检查问题 → 检查文档」把含宏的文件单列出来人工清理。别试图保留宏电子病历的合规要求是历史可追溯、内容不可篡改宏这种运行时动态逻辑是最难审计的。6. 模板上线后的验证技巧用质控规则反查模板质量模板集合上线不等于结束反而应该是验证的开始。我习惯用质控规则反查模板每条规则都去模板里找一个对应字段。6.1 建立模板与质控规则的一对一校验清单把医院现有质控规则整理成一张表注明每条规则读哪个字段。比如「入院记录 24 小时完成率」读完成时间戳「主诉不超过 50 字」读主诉字段。再拿这张表对照模板 JSON凡是被规则读取的字段模板里必须存在且绑定正确。质控规则 依赖字段 模板状态 入院记录24小时完成率 入院记录.完成时间 已完成 主诉不超过50字 CHIEF_COMPLAINT 已完成 手术安全核查必填 手术核查.核查时间 缺失需补这张对照表最好在上线第一周内跑出来逐条补齐。很多模板集合上线三个月后才发现质控项全是空的原因就是模板根本没有收集对应字段。反查规则能把发现时间从三个月压到三天。6.2 最小验收集三份模拟病历跑通完整闭环最后我会准备三份模拟病历覆盖普通内科入院、外科手术、急诊抢救三种场景从建模板、开病历、填字段、保存、打印到质控检查全流程跑一遍。任何一步不通都可能是模板问题比如字段在模板 JSON 里有但系统的表单编辑器里渲染不出来。这套验收用人工操作即可但三件事必须留痕模拟病历号、模板版本号、操作时间。上线后第一个月让实施人员每周把「用模板创建病历失败」的记录发来按失败原因分类。某类失败连续出现三次时不要打补丁回到模板本身找原因。模板集合整理这件事90% 的功夫都在动手前的体检和动手后的验证中间的 Word 转结构化反而最简单。我自己的教训是第一次接模板包时跳过了文件体检直接把全部 doc 转成 docx结果同名「入院记录」在三个子目录各有一份批量覆盖后临床反馈的格式和入库版本对不上返工两周。那以后我坚持先做 MD5 去重和版本登记再动转换脚本。希望这份流程能帮你在拿到「电子病历模版集合.rar」时少踩坑。模板包的价值不在「有了」而在「受控」每份模板都说清属于哪级、哪个版本、何时生效、由谁修改这套功夫到位了评级和质控自然就顺了。本文还有配套的精品资源点击获取