ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

信息化质量管理调查问卷:python-docx批量生成与解析

信息化质量管理调查问卷:python-docx批量生成与解析 简介这份信息化质量管理调查问卷以 docx 单文件形式提供面向企业质量管理者、体系推进人员、内审员及管理咨询与教学研究者用于诊断质量管理成熟度、梳理薄弱环节。问卷围绕企业基本情况、质量人员配置、ISO9001 与 ISO14001、OHSAS18001 等外部认证、质量奖励与品牌认可、质量持续改进驱动因素、经费投入、质量责任制度、职能设置、跨部门绩效考核、质量方针目标、员工质量意识与质量文化氛围、体系建立与整合、主导产品生产服务标准、作业标准化、标准制修订、顾客需求调查、产品策划、设计评审、研发质量工具、技术水平与开发方式等模块展开选项设有阶梯式描述便于对照评分。压缩包仅 1 个 docx约 28KB轻量易用。已有 109 人学习。读者可将其直接用于企业自评、部门访谈或培训前测也可作为质量体系改进的检查清单快速定位责任落实、绩效牵引、文化渗透与标准化执行中的差距。1. 信息化质量管理调查问卷为什么还要用 .docx 承载信息化项目验收前一周质量管理员丢过来一个压缩包三百多份回收的《信息化质量管理调查问卷.docx》。要在一周内出一份能支撑验收结论的质量分析报告靠人工翻开每份 Word 数格子基本不可能。这类问卷的麻烦不在题目设计而在于它天生是「给人看的排版文件」不是「给机器读的数据文件」。用 .docx 承载调查问卷好处是分发门槛低、盖章签字留痕方便、车间和分支机构的人不用登录任何系统代价是回收之后的每一步都得做结构化。围绕这个标题要讲清三件事质量管理维度怎么落成可量化题干.docx 模板怎么用脚本批量生成回收件怎么解析成能算信度和帕累托排序的数据表。适合质量管理员、信息化项目经理以及被临时抓来做数据处理的开发同学。2. 信息化质量管理调查问卷的维度拆解与 .docx 模板结构2.1 从 ISO 9001 与 IT 服务视角确定可测维度信息化质量管理问卷最容易犯的错是把「系统好不好用」直接写成一道十星题。打分结果集中在中位数看着挺漂亮实际上没法指导任何改进。可行的做法是先定维度再给每个维度配 35 个能指向具体事实的观测点。常用的五个维度是系统可靠性与可用性、响应与支持时效、数据准确与一致性、操作易用性、流程与制度配合度。每个观测点必须能被答卷人用「过去三个月里发生过几次」这类事实判断而不是靠情绪。下面这张表是一份典型的维度—观测点映射可直接改字段复用。维度观测点示例题型量表系统可靠性月度结账高峰期系统可用性达标李克特单选15系统可靠性近三个月因故障中断业务的次数频率单选0 次 / 12 次 / 3 次以上响应时效工单首次响应的及时程度李克特单选15数据准确性系统报表与手工台账的差异频率频率单选四档操作易用性新员工独立完成核心操作的培训天数数值填空天流程配合质量记录电子化后仍需纸质补签的环节数数值填空个提示频率题和数值题的选项尽量保留「不好判断」独立编码为 9不要塞进量表中间否则统计时会被误当成中间值参与均值计算。2.2 题干、量表与编码规则怎么定编码规则要在设计阶段就锁死后面解析才不用回头改脚本。建议用「维度首字母 两位序号」A01A05 是可靠性B 开头是响应时效依此类推。单选题的选项编码固定为 15 或 14多选、填空单独用 M、T 前缀区分。题干里不要出现「是否满意」这种复合问法一道题只问一件事否则信度检验时该题会明显拖低整体 α 值。量表方向也要统一。如果 A 组是「1 分最好」C 组是「5 分最好」后续加权求和会直接算错。约定一律「分值越高代表质量越好」反向题在解析阶段做6 - x翻转并在题目文字里标注「反向题」方便数据清洗时核对。这套约定写进 JSON 规格文件模板生成和解析共用同一份源。{ title: 信息化质量管理调查问卷年度版, scale: [1, 2, 3, 4, 5], reverse_items: [C03], sections: [ { name: A. 系统可靠性与可用性, items: [ {code: A01, text: 月度结账高峰期业务系统可用性满足工作要求, type: scale5}, {code: A02, text: 近三个月因系统故障导致业务中断的次数在可接受范围, type: scale5}, {code: A03, text: 系统升级窗口期的通知提前量足够做准备, type: scale5} ] }, { name: B. 响应与支持时效, items: [ {code: B01, text: 提交工单后首次响应的及时程度, type: scale5}, {code: B02, text: 问题一次性解决、无需反复沟通的程度, type: scale5} ] } ] }reverse_items声明反向题编码解析脚本读到就自动翻转type字段决定渲染成 5 列表格还是填空横线。规格文件一旦确认后续生成、解析、统计三个阶段都读它避免三处各写一份字段名。2.3 .docx 模板的样式与占位符约定纸质或半纸质回收场景下模板要保证打印后勾选框不会串行、跨页时表头能重复。常见做法是A4 纵向上下页边距 2.0 cm、左右 2.5 cm正文宋体五号10.5 pt维度标题黑体小四表格用单线网格并勾选「标题行重复」。观测点列宽给到 9 cm五列量表每列 1.2 cm剩下的给编码列。占位符只用两种{{FORM_CODE}}放问卷编号{{DEPT}}放部门。不要用 Word 的邮件合并域去嵌题目题目数量一旦变动域映射会全乱。编号规则建议QM-年份-四位流水号比如QM-2024-0137回收后直接从这个编号反查发放台账比在文件名里塞部门名可靠得多。3. 用 python-docx 批量生成信息化质量管理调查问卷3.1 环境准备与文档骨架批量生成的意义不只是省时间更重要的是让三百份问卷的版式、编码、题序完全一致回收后解析脚本只需要一套规则。python -m venv venv source venv/bin/activate # Windows 用 venv\Scripts\activate pip install python-docx pandas openpyxl mkdir -p out中文字体在 python-docx 里必须同时设置font.name和底层的w:eastAsia属性只设前者会导致 Word 里显示成默认英文字体中文变成方框或宋体回退。import json from docx import Document from docx.shared import Pt, Cm from docx.enum.text import WD_ALIGN_PARAGRAPH from docx.oxml.ns import qn SPEC json.load(open(qm_survey_spec.json, encodingutf-8)) def set_cn_font(run, name宋体, size10.5): 同时设置西文字体与 eastAsia 字体缺一不可 run.font.name name run.font.size Pt(size) run._element.rPr.rFonts.set(qn(w:eastAsia), name) def build(spec, form_code, dept, out_path): doc Document() for s in doc.sections: # 页面参数 s.top_margin, s.bottom_margin Cm(2.0), Cm(2.0) s.left_margin, s.right_margin Cm(2.5), Cm(2.5) h doc.add_paragraph(); h.alignment WD_ALIGN_PARAGRAPH.CENTER set_cn_font(h.add_run(spec[title]), 黑体, 16) meta doc.add_paragraph() set_cn_font(meta.add_run(f问卷编号{form_code} 填答部门{dept})) for sec in spec[sections]: p doc.add_paragraph(); set_cn_font(p.add_run(sec[name]), 黑体, 12) t doc.add_table(rows1, cols7); t.style Table Grid for i, v in enumerate([编码, 观测点, 1, 2, 3, 4, 5]): set_cn_font(t.rows[0].cells[i].paragraphs[0].add_run(v), 黑体, 10) for item in sec[items]: cells t.add_row().cells cells[0].text item[code] cells[1].text item[text] for c in cells[2:]: c.text □ # 统一用空心方框 for row in t.rows: row.cells[0].width Cm(1.6) row.cells[1].width Cm(9.0) doc.save(out_path) if __name__ __main__: for i in range(1, 201): code fQM-2024-{i:04d} build(SPEC, code, ________, fout/{code}.docx)build()里三个参数表页面尺寸、字体层级、表格列宽。列宽必须逐行设置python-docx 对Table.autofit的处理在不同 Word 版本下表现不一致显式赋值最稳。cells[2:]填空心方框□是为了后面解析时能靠符号替换定位作答项。3.2 关键参数对照与常见坑参数建议值说明页边距上下 2.0 cm / 左右 2.5 cm装订留白双面打印不掉字正文字号10.5 pt五号小于 9 pt 车间现场勾选易看串行表格边框Table Grid不用自定义边框避免跨页断线标题行重复需手工在 Word 里勾选脚本不能可靠设置模板定稿时处理一次问卷编号QM-年份-四位流水与发放台账一一对应注意doc.sections[0]只改第一节。如果模板里插了分节符做横向附录必须遍历所有 section否则后半段版式会回到默认值。生成完成后建议抽 3 份转成 PDF 目检重点看表格有没有跨页断裂、方框有没有因为字体缺失变成问号。字体缺失是批量生成最常见的返工原因服务器上装好宋体、黑体再跑脚本。4. 回收的 .docx 调查问卷如何解析成可分析的数据表4.1 从表格单元格里抽取作答行回收件分两种一种是原样打印后手工勾选再扫描另一种是直接发电子版让人在 Word 里打勾。前者建议配 OCR 或者直接改用在线表单后者用 python-docx 就能全自动处理。解析的核心是定位「编码 题干 五个选项」这一行然后判断哪一个选项被打了勾。import re import pandas as pd from docx import Document QTAG re.compile(r^(?Pcode[A-Z]\d{2})\b) # 各种可能的勾选符号统一映射成 1 CHECKS {☑, √, ✓, ■, ●, ×, 1, 是} REVERSE set(json.load(open(qm_survey_spec.json, encodingutf-8))[reverse_items]) def parse_form(path, form_code): doc Document(path) rec {form_code: form_code} for table in doc.tables: for row in table.rows: cells [c.text.strip() for c in row.cells] if len(cells) 7: continue m QTAG.match(cells[0]) if not m: continue code m.group(code) score None for idx, cell in enumerate(cells[2:7], start1): # 1~5 对应五列 if cell and cell[0] in CHECKS: score idx break if score and code in REVERSE: score 6 - score # 反向题翻转 rec[code] score return rec rows [parse_form(freceived/QM-2024-{i:04d}.docx, fQM-2024-{i:04d}) for i in range(1, 201)] df pd.DataFrame(rows).set_index(form_code)正则^(?Pcode[A-Z]\d{2})\b只认两位数字编码可以把页眉里的「Q1」之类干扰项排除掉。cells[2:7]对应五列量表切片边界要和生成脚本里的列序严格一致一旦有人手工插了一列切片就会错位所以解析前先跑一遍列数校验遍历表格时如果发现某行长度不等于 7 且以编码开头直接抛异常并记录文件名。CHECKS集合里放了数字 1 和汉字「是」是为了兼容部分人用键盘敲数字答题的情况。如果同一份问卷里出现多个勾选脚本取第一个命中列。多选场景要改成累计列表不能只留一个值。4.2 数据清洗缺失、直线作答与逻辑冲突# 1) 缺失率过高的题直接标记不参与维度均分 missing_rate df.isna().mean() bad_items missing_rate[missing_rate 0.15].index.tolist() # 2) 直线作答所有题答案完全相同且样本量足够 scale_cols [c for c in df.columns if c not in bad_items] df[straight] df[scale_cols].nunique(axis1) 1 # 3) 逻辑冲突A02 选「0 次」但 B01 打最低分 conflict df[(df.get(A02) 5) (df.get(B01) 1)] df_clean df[~df[straight]].copy() df_clean[scale_cols] df_clean[scale_cols].fillna(df_clean[scale_cols].median()) print(f原始 {len(df)} 份剔除直线作答 {df[straight].sum()} 份 f保留 {len(df_clean)} 份待复核 {len(conflict)} 份)清洗顺序很重要先剔直线作答再填缺失否则中位数会被大量重复值带偏。缺失率阈值 15% 是经验值样本量小于 50 时可以放宽到 25%。逻辑冲突的那部分不要直接删导出成单独的 Excel 交给质量管理员电话回访这类样本往往能挖出真实问题。清洗结果落盘成qm_survey_clean.xlsx保留原始列和翻转后的列各一份方便回溯。清洗动作触发条件处理方式整题缺失缺失率 15%该题不计入维度均分直线作答量表题取值唯一整份剔除并记录编号反向题编码在 reverse_items6 - x翻转逻辑冲突跨题矛盾规则单独导出人工复核5. 信度校验与质量改进优先级让调查问卷数据真正可用5.1 Cronbach α 与维度内部一致性自检数据表出来以后先别急着算均值先看这份问卷测得稳不稳。Cronbach α 是最省事的内部一致性指标公式只有三行。import numpy as np def cronbach_alpha(sub): sub: 同一维度下的题目列行是样本 k sub.shape[1] item_var sub.var(axis0, ddof1).sum() total_var sub.sum(axis1).var(ddof1) return k / (k - 1) * (1 - item_var / total_var) for dim, cols in {A: [A01, A02, A03], B: [B01, B02]}.items(): print(dim, round(cronbach_alpha(df_clean[cols]), 3))系数低于 0.6 说明这几道题没在测同一件事通常是题干里混了两个问法或者反向题忘了翻转。逐题看「删除该题后的 α」如果删掉某题后 α 明显上升这道题就该在下一版问卷里改掉。样本量不足 30 时 α 波动很大别用它下结论改用维度内两两相关系数看趋势即可。5.2 用加权得分与帕累托排序锁定改进项维度权重不要平均分配。按验收指标里各模块的实际权重赋值比如可靠性 0.3、时效 0.25、数据准确性 0.2、易用性 0.15、流程配合 0.1然后算出每个部门的加权标准化得分。WEIGHTS {A: 0.30, B: 0.25, C: 0.20, D: 0.15, E: 0.10} DIM_ITEMS {A: [A01, A02, A03], B: [B01, B02]} # 归一化到 0~1005 分制换算 dim_score {d: df_clean[cols].mean(axis1) / 5 * 100 for d, cols in DIM_ITEMS.items()} score sum(dim_score[d] * w for d, w in WEIGHTS.items()) # 单项失分贡献越接近 100 说明越急需改进 gap pd.DataFrame({c: 100 - df_clean[c] / 5 * 100 for cols in DIM_ITEMS.values() for c in cols}) pareto gap.mean().sort_values(ascendingFalse) pareto_cum pareto.cumsum() / pareto.sum() print(pd.DataFrame({失分贡献: pareto.round(1), 累计占比: (pareto_cum * 100).round(1)}).head(6))累计占比到 80% 的那几道观测点就是本轮质量改进的必改项其余进观察清单。把这份排序和前面 α 系数低于 0.6 的题目交叉比对既是高失分项、又拖低信度的题下一版问卷直接重写题干失分高但信度正常的题才是真正需要推动系统改造或流程调整的地方。注意各部门样本量差异大时先按部门分层算均值再汇总直接对全体取平均会让样本量大的部门主导结论。分层结果建议同时输出一份部门对照表避免验收会上被问「为什么我们部门分最低」时拿不出依据。本文还有配套的精品资源点击获取
返回列表