本技能覆盖 PMO 需求追踪的完整工作流:从原始 Excel 数据清洗 → 合并 → 看板生成。
输入文件:
需求收集表.xlsx(原始需求数据,含2行合并表头)Matrix项目数据.xlsx(Matrix 项目数据)输出文件:
合并需求数据_清洗后.xlsx(含 合并数据 和 按业务线拆分 两个 Sheet)执行步骤:
Step 1:运行合并清洗脚本
cd {工作目录}
python3 scripts/merge_data.py
脚本自动完成:
strip()、处理 nan)合并需求数据_清洗后.xlsx(Sheet: 合并数据)Step 2:按业务线拆分
python3 scripts/split_by_business_line.py
脚本自动完成:
合并需求数据_清洗后.xlsx 第一个 Sheet业务线(212982) 字段中含逗号的记录拆分为多条按业务线拆分注意:merge_data.py 中的输入输出路径是硬编码的,如果用户提供了不同路径,需要先修改脚本中的 file1_path、file2_path、output_path 变量。
读取 合并需求数据_清洗后.xlsx(sheet: 按业务线拆分),生成 PMO看板.html。
执行:
cd {工作目录}
python3 scripts/generate_dashboard_data.py
脚本自动完成:
创建时间 >= 2026-01-01)biz_completion_list)# JS 语法检查
cd {工作目录}
node -e "
const fs=require('fs');
const html=fs.readFileSync('PMO看板.html','utf8');
const m=html.match(/<script>[\s\S]*?<\/script>/g);
let js='';m.forEach(s=>{js+=s.replace(/<\/?script>/g,'');});
try{new Function(js);console.log('JS 语法正常');}catch(e){console.log('JS 错误:',e.message);}
"
验证通过后,用 deliver_attachments 交付 PMO看板.html。
用户可直接用浏览器打开(file:// 协议,离线可用)。
| 图表 | 说明 |
|---|---|
| ------ | ------ |
| 汇总卡片 | 需求总量、已完成、进行中、完成率、业务线数 |
| 周度/月度趋势 | 新增 vs 完成条形图 |
| 周度/月度吞吐量 | 完成-新增,绿色为正、红色为负 |
| 燃尽图(周度/月度) | 剩余未完成需求折线图 |
| 需求优先级分布 | 饼图(高/中/低) |
| 业务线完成度 | 横向条形图,按完成率降序,显示 完成率%(已完成/总数) |
| 各业务线状态分布 | 堆叠条形图 |
| 业务线甘特图 | 浮条时间线图,按需求着色(已完成=绿、进行中=蓝),动态高度 |
| 文件 | 位置 | 说明 |
|---|---|---|
| ------ | ------ | ------ |
merge_data.py | scripts/ | 数据清洗与合并(去空格、状态归一化、外连接合并) |
split_by_business_line.py | scripts/ | 按业务线拆分(逗号分隔的业务线拆分为多条记录) |
generate_dashboard_data.py | scripts/ | 看板生成脚本(读取清洗后Excel → 生成HTML) |
chart.min.js | assets/ | Chart.js 本地副本(v4.4.1) |
chartjs-plugin-datalabels.min.js | assets/ | datalabels 插件本地副本 |
只保留 创建时间 >= 2026-01-01 的数据,避免历史数据干扰。
Python 生成已排序的列表(按完成率降序),含 name/rate/done/total 字段,
JS 直接使用数组渲染,避免字典查找导致 undefined。
业务线完成度图表根据业务线数量动态设置高度:Math.max(300, 条数 × 44)px
ch-weekly-trend, ch-monthly-trend, ch-weekly-tp, ch-monthly-tp, ch-weekly-burndown, ch-monthly-burndown, ch-priority, ch-biz-completion, ch-biz-statusch-b- 前缀每个图表渲染用独立 try-catch,单个图表失败不影响其他图表。
Q: 图表显示 undefined?
A: 通常是浏览器缓存了旧版 HTML,按 Cmd+Shift+R 强制刷新。
Q: 业务线完成度显示 (undefined/undefined)?
A: datalabels formatter 第二个参数是 context 对象,需用 ctx.dataIndex 取索引,不能直接用 i。
Q: 想调整图表顺序?
A: 修改 scripts/generate_dashboard_data.py 中 HTML 模板部分的卡片顺序。
Q: 发给同事后打开报错 Chart is not defined?
A: HTML 使用 CDN 加载 Chart.js(jsdelivr),需要联网。如果同事在内网无法访问外网,需要把 chart.min.js 和 chartjs-plugin-datalabels.min.js 和 HTML 放在同一目录。
Q: 合并后数据量与预期不符?
A: 检查 merge_data.py 中 Matrix ID 格式是否一致。如果 file1 的 ID 带 .0 后缀而 file2 不带,会导致外连接匹配失败。脚本已内置 .0 后缀清理逻辑。
Q: 企微导出的 Excel 报错 Fill() takes no arguments?
A: openpyxl 3.1.x 与部分 Excel 样式不兼容。merge_data.py 已内置猴子补丁解决。
Q: 看板文件覆盖了历史版本?
A: 每次生成看板文件名自动带日期(如 PMO看板_20260526.html),历史版本不会被覆盖。
merge_data.py 中 file1 和 file2 的 Matrix ID 统一去 .0 后缀,解决外连接匹配失败导致的数据偏差(349 → 363)merge_data.py 中缺失的 处理优先级 字段默认填"中",解决优先级分布饼图为空的问题generate_dashboard_data.py 中 Chart.js 和 datalabels 改用 jsdelivr CDN 加载,解决分享时外部 JS 文件找不到的问题generate_dashboard_data.py 输出文件名格式为 PMO看板_YYYYMMDD.html,避免覆盖历史版本generate_dashboard_data.py 中 weekly_new_biz 等 6 个字段改为 {业务线: {周: 数量}} 索引顺序,修复业务线看板图表为空的问题merge_data.py 新增 openpyxl Fill 猴子补丁和 safe_read_excel 函数,解决企微导出 Excel 样式解析崩溃的问题generate_dashboard_data.py 中新增 gantt_biz 数据计算和各业务线甘特图渲染。选中业务线后,在走势图下方显示该业务线的需求时间线(浮条图),按状态着色(已完成=绿、进行中=蓝、其他=灰),支持动态高度和日期格式化 tooltip。共 5 个版本