ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Python生成门诊清洁消毒记录表:docx与xlsx校验留档

Python生成门诊清洁消毒记录表:docx与xlsx校验留档 简介面向医疗机构门诊科室感控管理的清洁消毒记录表以单份docx表格形式提供可直接套用的登记模板。表格围绕诊室空气、物体表面、体温表浸泡、空调滤网等对象覆盖紫外线照射、1000mg/L含氯消毒剂与75%酒精擦拭等方式按上午、中午、下午三个时段逐项留痕并注明开窗通风每日至少3次、紫外线照射前关闭门窗无人照射30分钟、灯管每周酒精擦拭、空调滤网每月清洁一次等要求末尾以“落实请打√”完成结果确认与签名。压缩包共1个docx文件约8KB结构简洁、打印即用适合门诊护士、感控专员及基层医疗机构日常督查与台账归档。记录表按空气、物表、器械等维度分栏可打印张贴于诊室逐项核对。已有147人学习下载可帮助快速建立可追溯的消毒执行记录。1. 门诊科室物品清洁消毒记录表为什么要先落成一张 .docx门诊早上七点半开诊之前保洁和分诊护士往往只有十几分钟要把候诊椅、分诊台面、门把手、血压计袖带、体温枪这些高频接触物品过一遍。真到了卫生监督抽查或者院感自查被问一句上周三口腔诊室那把椅子的消毒记录呢翻出来的是一叠边角卷起的散页签名缺一个、时间漏一行、消毒剂浓度随手写成适量。门诊区域科室各种物品清洁消毒记录表最新.docx 这类文件的真正价值不在于有张表而在于这张表能被复现、被核对、被追责时拿得出手。它要同时满足三种人护士长要能一眼看出谁漏填院感专兼职人员要能对照消毒剂参数判断合不合规信息科或做表单的人要能把它批量生成、版本可控地发到十几个科室。把字段、参数、生成脚本和留档规则一次讲透比反复改表格模板省事得多。2. 门诊区域清洁消毒记录表的字段拆解与消毒剂参数对照2.1 三类物品的风险分级决定表格要不要拆成几张门诊区域的物品按感染风险通常分三档分档不是为了好看而是决定要不要进这张表。低度风险物品指不直接接触患者完整皮肤黏膜的比如候诊椅、地面、墙面、窗台、电梯按钮中度风险物品指接触完整皮肤或黏膜的比如诊桌、诊疗床、血压计袖带、听诊器探头、体温枪外壳、检验科采血台面高度风险物品指进入无菌组织或血管的比如口腔科手机、内镜、穿刺器械这类不归门诊清洁消毒记录表管走消毒供应中心的回收与灭菌流程。常见做法是低度和中度合并进同一张日常表用物品类别字段区分高度风险另立一张器械交接表。如果门诊量不大把所有物品塞进一张 A4 横向表格也能用但列太多会挤掉签名区打印出来字小到看不清。我一般建议单张表不超过 12 列超过就拆表宁可多印一张纸。注意分档依据是物品与人体组织的接触方式不是物品价格或使用频次别按贵不贵来分。2.2 一张能过抽查的记录表要落到哪些字段字段设计的核心是任何一行记录单独拎出来都能回答谁、什么时候、对什么、用什么、怎么做、谁复核。缺其中任何一项抽查时都可能被判为记录不完整。分区字段名填写要求常见错误基本信息科室与机构科室命名一致写简称、写俗称基本信息区域/房间到具体房间号或工位只写门诊基本信息日期、班次上下午分开记录一天只签一次名物品明细物品名称、材质材质决定能不能用含氯消毒剂材质栏留空物品明细清洁/消毒方式擦拭、浸泡、喷雾、紫外线照射方式与物品不匹配物品明细消毒剂名称及浓度写具体浓度如 500mg/L写适量少许物品明细作用时间到分钟如 30 分钟只写起止时间不写时长物品明细频次每日 2 次、随时频次栏长期空白执行与复核执行时间、执行人具体到分钟并签名提前签、代签执行与复核复核人、复核时间护士长或院感人员同一个人同时签两栏执行与复核备注污染后随时消毒等特殊情况全部空白材质这一栏容易被忽略但它直接约束消毒剂选择。含氯消毒剂对金属有腐蚀性对某些高分子材料有老化作用门诊常见的电子体温枪、血压计外壳用 75% 乙醇或季铵盐类擦拭更稳妥。把材质写进表里等于把能不能用这种消毒剂的判断前置到了表格设计中。2.3 消毒剂浓度、作用时间与频次的参数对照参数不是拍脑袋定的要跟产品说明书和本单位的感染管理制度对齐。下面这张对照表按门诊场景里最常见的做法整理具体执行以你手上那瓶消毒剂的说明书标注为准不同厂家、不同剂型的有效成分含量差别不小。消毒对象常用消毒剂参考浓度参考作用时间建议频次一般物体表面诊桌、椅面含氯消毒剂500mg/L30 分钟每日 2 次高频接触表面门把手、扶手含氯消毒剂或 75% 乙醇500mg/L 或 75%30 分钟 / 1~3 分钟每日 2 次污染随时精密仪器外壳、电子设备75% 乙醇或季铵盐类75% 或按说明书1~3 分钟每日 1~2 次地面含氯消毒剂500mg/L30 分钟每日 1~2 次有明显血液体液污染含氯消毒剂1000mg/L 起30 分钟以上随时频次栏是最容易在抽查里被挑刺的地方。每日 2 次要落到具体的两个时间点上下午各一次写清楚是开诊前和下班后。门诊量大的科室午间高峰后如果不加一次高频接触表面的菌落数会明显回升。记录表里可以把频次写成每日 2 次07:00 前、17:00 后比只写每日 2 次更有说服力。2.4 用 Python 算含氯消毒剂配制量把结果填进表里含氯消毒剂的现场配制靠人手估算浓度偏差是普遍问题。5% 有效氯原液要配成 500mg/L 的擦拭液用公式算比用感觉倒准得多。把这套计算固化成一个函数打印一张配制速查表贴在处置室比在记录表上写大约一瓶盖可靠。def dilute(stock_percent: float, target_mg_l: float, volume_l: float) - dict: stock_percent: 原液有效氯百分比如 5 表示 5% target_mg_l: 目标浓度 mg/L一般物体表面常用 500 volume_l: 需要配制的溶液体积单位升 if not (0 stock_percent 100) or target_mg_l 0 or volume_l 0: raise ValueError(参数超出合理范围请核对原液标签) stock_mg_l stock_percent / 100 * 1_000_000 # 5% - 50000 mg/L if target_mg_l stock_mg_l: raise ValueError(目标浓度不低于原液浓度本身就无需稀释) stock_ml target_mg_l * volume_l / stock_mg_l * 1000 # 换算成毫升 water_ml volume_l * 1000 - stock_ml return { 原液(mL): round(stock_ml, 1), 加水(mL): round(water_ml, 1), 目标浓度(mg/L): target_mg_l, 配制总量(L): volume_l, } # 一次性配 2L 的 500mg/L 擦拭液 print(dilute(5, 500, 2)) # {原液(mL): 20.0, 加水(mL): 1980.0, 目标浓度(mg/L): 500, 配制总量(L): 2}stock_mg_l把百分比换算成毫克每升1% 等于 10000mg/L所以 5% 是 50000mg/L。stock_ml用的是稀释前后溶质质量相等的等式算出来是所需的原液体积。water_ml用总量减去原液不要反过来先算水再补原液那样补进的原液还会带体积误差。配制完用余氯测试纸抽测一次读数落在目标值上下合理区间才算合格这一步的结果同样可以记进表里的备注栏。门诊每天配一次、记录一次配制人签名和测试结果一起留痕是应对抽查最有效的两个细节。3. 用 python-docx 生成「门诊区域科室物品清洁消毒记录表最新.docx」3.1 环境准备python-docx 安装与中文字体设定生成 docx 的脚本不需要复杂的框架python-docx 够用配合 Python 3.10 及以上版本即可。安装只装这一个包python -m pip install python-docx --upgrade python -c import docx; print(docx.__version__)第二行是自检能打印出版本号说明装好了。中文环境里最容易踩的坑不是安装而是字体python-docx 的run.font.name只设置西文字体中文会回落到默认字体打印出来标题变成宋体、正文变成另一种字形看上去很别扭。正确做法是同时设置w:eastAsia属性把中文字体显式绑上去。3.2 页面设置A4 横向、页边距与列宽分配12 列的表格在 A4 纵向纸上排不下必须横向并且把页边距收紧到 1.2cm 左右否则备注栏会被挤成竖排。列宽按内容长度分配而不是平均分物品名称和消毒剂两列给宽一些序号和频次给窄一些。列名建议宽度(cm)理由序号1.0只放数字区域/房间2.0房间号一般 4~6 个字物品名称3.0名称最长材质1.8如不锈钢塑料清洁/消毒方式2.2两到四个字消毒剂及浓度2.8含浓度数字作用时间1.6分钟数频次1.6每日 2 次执行时间2.0到分钟执行人1.6签名复核人1.6签名备注2.0少量文字列宽合计约 23.2cmA4 横向可打印宽度约 27.7cm留出余量给页边距和表格线不会溢出。3.3 表头底纹、跨页重复表头与中文字体绑定的完整脚本下面这段脚本生成一份可直接打印的空白记录表。三个函数分别负责底纹、表头重复和字体都是文档排版里绕不开的细节。from docx import Document from docx.shared import Pt, Cm from docx.enum.section import WD_ORIENT from docx.enum.table import WD_TABLE_ALIGNMENT from docx.enum.text import WD_ALIGN_PARAGRAPH from docx.oxml.ns import qn from docx.oxml import OxmlElement HEADERS [序号, 区域/房间, 物品名称, 材质, 清洁/消毒方式, 消毒剂及浓度, 作用时间, 频次, 执行时间, 执行人, 复核人, 备注] WIDTHS [1.0, 2.0, 3.0, 1.8, 2.2, 2.8, 1.6, 1.6, 2.0, 1.6, 1.6, 2.0] def set_font(run, name宋体, size10.5, boldFalse): 同时设置西文与中文字体缺一不可 run.font.name name run.font.size Pt(size) run.font.bold bold run._element.rPr.rFonts.set(qn(w:eastAsia), name) def shade(cell, colorD9E2F3): 给单元格加底纹用于表头分区 shd OxmlElement(w:shd) shd.set(qn(w:val), clear) shd.set(qn(w:fill), color) cell._tc.get_or_add_tcPr().append(shd) def repeat_header(row): 表格跨页时自动重复表头长表格必备 trPr row._tr.get_or_add_trPr() el OxmlElement(w:tblHeader) el.set(qn(w:val), true) trPr.append(el) doc Document() sec doc.sections[0] sec.orientation WD_ORIENT.LANDSCAPE sec.page_width, sec.page_height Cm(29.7), Cm(21.0) sec.left_margin sec.right_margin Cm(1.2) sec.top_margin sec.bottom_margin Cm(1.5) title doc.add_paragraph() title.alignment WD_ALIGN_PARAGRAPH.CENTER set_font(title.add_run(门诊区域科室物品清洁消毒记录表), 黑体, 16, True) info doc.add_paragraph() set_font(info.add_run(科室__________ 区域/房间__________ 日期____年__月__日 班次上午 / 下午), 宋体, 10.5) table doc.add_table(rows1, colslen(HEADERS)) table.style Table Grid table.alignment WD_TABLE_ALIGNMENT.CENTER table.autofit False hdr table.rows[0] repeat_header(hdr) for i, name in enumerate(HEADERS): cell hdr.cells[i] cell.width Cm(WIDTHS[i]) p cell.paragraphs[0] p.alignment WD_ALIGN_PARAGRAPH.CENTER set_font(p.add_run(name), 黑体, 10, True) shade(cell) for idx in range(8): # 8 行空白记录区 row table.add_row() row.cells[0].paragraphs[0].alignment WD_ALIGN_PARAGRAPH.CENTER set_font(row.cells[0].paragraphs[0].add_run(str(idx 1)), 宋体, 10) foot doc.add_paragraph() set_font(foot.add_run(复核人签名______________ 复核日期____年__月__日), 宋体, 10.5) doc.save(门诊区域科室物品清洁消毒记录表最新.docx) print(生成完成门诊区域科室物品清洁消毒记录表最新.docx)3.3.1 三个函数各自解决什么问题set_font里的rFonts是唯一能控制中文字形的地方只写run.font.name会得到一个英文用宋体、中文随机的怪结果。shade直接操作 OOXML 的w:shd节点python-docx 没有封装单元格底纹的接口只能自己拼 XML。repeat_header往行属性里塞w:tblHeader打印时表格如果跨到第二页表头会自动重复这一条在长表格里能省掉大量解释成本。3.4 生成结果自检字段数、行数、文件名与打印预览脚本跑完不要直接发给科室先做三项自检。一是打开文档确认表格列数为 12、空白行数为 8Table Grid样式下所有单元格都有边框二是确认标题是黑体、正文是宋体打印预览里没有出现字体替换三是确认文件名和内容对得上——很多单位要求文件名带版本和时间比如门诊区域科室物品清洁消毒记录表最新.docx配合文件属性里的创建时间别在文件名里写最终版真的最终版。提示批量生成时把科室名作为参数传进标题只生成一次模板代码十几个科室的文件几分钟就能出来比手工另存为再改标题快得多。4. 记录表落地从打印签字到 xlsx 台账的校验与留档4.1 docx 打印版与 xlsx 台账版的分工纸质签字在门诊场景里短期不会消失因为它解决了谁签的字这个责任归属问题。但纸质表有个天然缺陷汇总极其麻烦。护士长月底要统计哪个区漏填最多只能一张张翻。合理分工是docx 负责现场填写和签字xlsx 负责事后录入与汇总统计两者字段保持一致用同一份字段清单生成避免人工对照出错。如果科室已经用电子表单填报可以跳过誊抄环节让填写端直接落到 xlsx 或数据库但签名栏仍要保留用账号登录时间戳代替手写签名时必须在制度里写清楚这一条。4.2 用 openpyxl 给填报版加下拉选项与必填高亮电子填报版最容易出问题的是自由文本方式栏有人写擦、有人写擦拭统计时变成两个值。用下拉列表把可选值框死用条件格式把漏填的行标黄录数据的人一眼就能看到问题。from openpyxl import load_workbook from openpyxl.worksheet.datavalidation import DataValidation from openpyxl.formatting.rule import FormulaRule from openpyxl.styles import PatternFill wb load_workbook(门诊区域科室物品清洁消毒记录表最新.xlsx) ws wb.active # 方式列E限定取值避免擦/擦拭/抹这类同义异写 dv_method DataValidation( typelist, formula1擦拭,浸泡,喷雾,紫外线照射,其他, allow_blankFalse, showErrorMessageTrue, errorTitle取值不合法, error请从下拉列表中选择清洁消毒方式, ) ws.add_data_validation(dv_method) dv_method.add(E2:E500) # 合格判定列M同样限定 dv_result DataValidation(typelist, formula1合格,不合格,已整改, allow_blankFalse) ws.add_data_validation(dv_result) dv_result.add(M2:M500) # 执行时间(J)或执行人(K)为空 - 整行标黄提示录入人补全 fill PatternFill(solid, fgColorFFF2CC) ws.conditional_formatting.add( A2:M500, FormulaRule(formula[OR($J2,$K2)], fillfill, stopIfTrueFalse), ) # 列宽与冻结首行方便逐行核对 for col, w in zip(ABCDEFGHIJKLM, [6, 14, 20, 12, 14, 18, 10, 10, 12, 10, 10, 16, 10]): ws.column_dimensions[col].width w ws.freeze_panes A2 wb.save(门诊区域科室物品清洁消毒记录表最新.xlsx) print(校验规则已写入)formula1里的取值用英文逗号分隔整串用单引号包住再交给双引号这是 openpyxl 的固定写法。allow_blankFalse表示不允许留空配合错误提示录入人想跳过都跳不过去。条件格式的公式里$J2用了混合引用列锁定、行不锁定这样规则会随行号自动平移一条规则覆盖五百行。freeze_panes冻结在 A2滚动时表头始终可见录几十行都不会串行。4.2.1 参数改了以后为什么要回头改表头消毒剂浓度从 500mg/L 调整到 1000mg/L或者门诊新增了一类物品改完下拉列表一定要回头确认表头字段有没有跟着变。常见疏忽是下拉列表改了、模板 docx 没改打印出来的纸质表还是旧选项填报人只能手写下拉限制形同虚设。把 docx 和 xlsx 放在同一个目录下、用同一份字段常量生成这个问题就消失了。4.3 用 pandas 汇总各科室依从率与漏填清单月底汇总不需要写复杂的循环pandas 几行就能出结果。关键是把日期列转成时间类型否则排序和按周分组都会出错。import pandas as pd df pd.read_excel(门诊清洁消毒台账.xlsx, sheet_name记录, dtypestr) df[执行时间] pd.to_datetime(df[执行时间], errorscoerce) df[日期] df[执行时间].dt.date # 漏填清单执行人或执行时间为空 missing df[df[执行人].isna() | df[执行时间].isna()][ [日期, 科室, 区域/房间, 物品名称, 执行人, 执行时间] ].sort_values([日期, 科室]) # 依从率按科室 x 日期统计有执行人的记录占比 rate (df.assign(已执行df[执行人].notna()) .groupby([科室, 日期])[已执行] .mean().round(3).unstack()) with pd.ExcelWriter(门诊清洁消毒月报.xlsx) as w: missing.to_excel(w, sheet_name漏填清单, indexFalse) rate.to_excel(w, sheet_name科室依从率) print(f漏填记录 {len(missing)} 条)errorscoerce把无法解析的时间变成 NaT不抛异常这样脏数据会自然落进漏填清单里反而成了排查线索。groupby后的mean()对布尔列求均值就是比例比手写计数除法清楚。输出成两个 sheet漏填清单直接发给科室整改依从率表给护士长看趋势比一张大宽表实用。4.4 留档、命名与版本控制的三条硬规矩第一条命名规则固定下来格式建议是门诊区域科室物品清洁消毒记录表-科室名-年月-版本号不要出现最终修改后(1)这类词检索和归档时全是噪音。第二条纸质记录按科室和月份装订留存期限按本单位制度和当地卫生监督部门的要求执行常见做法是不少于一年涉及污染事件的记录单独留存。第三条模板文件本身纳入版本管理改一次留一份旧版不要在原文件上直接覆盖出现到底哪天开始换了新版表的争议时旧版文件就是证据。注意留档留的是填写完成的记录不是空白模板。空白模板归档没有意义别把两者混在一起存。5. 抽查复核的进阶技巧版本一致性校验与扫码填报模板发到十几个科室之后最隐蔽的问题不是漏填而是各科室用的表不是同一版。有人把列宽改了有人删了备注列汇总时字段对不上。用一个哈希校验就能把这件事自动化以院感科手里的模板为基准定期扫描各科室目录比对文件哈希不一致的挑出来重新下发。import hashlib import pathlib def file_md5(path: pathlib.Path, chunk: int 1 20) - str: h hashlib.md5() with open(path, rb) as f: for block in iter(lambda: f.read(chunk), b): h.update(block) return h.hexdigest() base pathlib.Path(./模板/门诊区域科室物品清洁消毒记录表最新.docx) base_hash file_md5(base) for p in pathlib.Path(./科室回收).rglob(*.docx): same 一致 if file_md5(p) base_hash else 不一致 print(f{same}\t{p.name})file_md5分块读取几百 KB 的 docx 和几百 MB 的附件都能处理不会一次性把文件读进内存。rglob递归扫子目录回收目录怎么建都不影响结果。哈希一致只说明二进制完全相同如果科室只是在模板里填了内容哈希必然不同所以这个校验只对空白模板有效回收的填写件要另设目录别混在一起扫。复核层面还可以加一张抽查看板把每月的依从率、漏填条数、复核及时率放在一起看。指标计算方式参考阈值异常时的动作记录依从率有执行人签名的行数 / 应填行数≥95%低于阈值时约谈科室复核及时率24 小时内完成复核的比例≥90%延长复核窗口或增派复核人漏填条数执行时间或执行人为空的行数单月 ≤3逐条追溯到人模板一致性与基准模板哈希相同的文件比例100%重新下发模板并回收旧版再往前一步是扫码填报把每类物品的关键信息编码成一个二维码贴在物品旁边或工位上扫码后表单自动带出物品名称、材质、建议消毒剂和频次填报人只需要确认时间、签名。这种做法把记不住参数和懒得找表两个阻力同时消掉了代价是需要一次性把物品清单整理干净——物品编号、材质、位置三项缺一不可否则二维码扫出来还是空白表单反而更麻烦。整理清单这件事用前面那份字段表跑一遍 pandas 去重和补全比人工核对快得多。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进