标准样式 Visio 流程图生成器 v1.0
把一份流程描述(PPT流程图、SOP、操作手册、自然语言)渲染成企业标准样式的 Visio 原生 .vsdx 文件,同时输出横向(LR)和纵向(TD)两个方向版本。
样式规范
| 元素 | 形状 | 填充色 RGB | 字号 | 说明 |
|---|---|---|---|---|
| 开始/结束 | 圆角矩形 | (198,239,206) 淡绿 | 11 pt | 每个流程有且仅有一个 start、一个 end |
| 活动/处理 | 矩形 | (255,255,255) 白 | 10.5 pt | 普通步骤,窄框 w=1.9~2.1 in |
| 判断/审批 | 菱形 | (255,99,99) 红 | 11 pt | 必须有≥2条出边 |
| 交付物/文档 | 带折角五边形 | (255,235,156) 黄 | 10.5 pt | 产生单据/报表 |
| 数据/系统存储 | 平行四边形 | (242,242,242) 灰 | 10.5 pt | 系统锁任务、存快照 |
| 泳道标题 | 矩形 | (230,230,230) 中灰 | 11 pt 加粗 | 左侧(LR)或顶部(TD) |
| 泳道背景 | 矩形 | (250,250,250) 浅灰 | — | 极浅灰底 |
| 阶段标签 | 矩形 | 紫/绿/蓝浅色 | 10 pt 加粗 | 顶部跨列分组 |
| 所有文字 | — | (0,0,0) 纯黑 | — | 不溢出框 |
| 所有边框/连线 | — | (0,0,0) 纯黑 | 1pt | 直角,箭头EndArrow=4 |
核心设计原则(踩过的坑,必须遵守)
1. 连线就近原则,绝对不穿框
这是最重要的原则。 连接线从形状边缘进出,绝对不穿过任何文字框内部。
- 同列(同泳道)节点:直接垂直直连(底部→顶部),不绕路
- 跨列节点:从形状右边→目标形状左边,水平直连
- 同列有多条垂直线时(如 col0 同时有 n1→n2 和 n3→n4→n5):用
x_offset把其中一条线偏开 0.3~0.4 英寸,两条垂直线平行不交叉 - 绝不手动画L形折线(会穿框严重),一律用 Visio Dynamic Connector +
GlueToPos(x,y)自动路由 - RouteStyle=3(正交直角),不要用 RouteStyle=2(会变斜线)
2. 节点窄幅,文字自动换行
- 节点宽度 1.9~2.1 英寸(不要用2.6+的宽框),长文本自动换行2~3行
- 节点高度 0.8~1.0 英寸,根据文字行数调整
- 菱形 w=1.3, h=0.9
- 字体 10.5~11 pt,不要太小(用户要求放大)
3. 对齐与不越界
- 所有节点按列中心对齐(LR版)或行中心对齐(TD版)
header_w ≥ 1.6 in,col_w ≥ 2.6 in,margin ≥ 0.3 in- x_offset 偏移后必须检查节点左边 ≥ header_w,不能越出泳道左边界
- 生成后导出 PNG 肉眼检查,不能只看脚本输出 OK
4. 删减回环线,保留主流程
- 只保留主流程连接线(按时间顺序从左到右/从上到下)
- 删减月度循环回环、半年度回环、跨阶段回环等非主线
- 每个节点至少有1条入边和1条出边(start/end除外)
工作流
阶段0:环境自检
# 确认Visio COM可用(用系统Python,不是sandbox python)
& "C:\Users\oushihong\AppData\Local\Programs\Python\Python314\python.exe" -c "import win32com.client; print('OK')"
# 杀残留Visio
Get-Process -Name VISIO -ErrorAction SilentlyContinue | Stop-Process -Force; Start-Sleep 2
- 缺 pywin32 →
pip install pywin32 - COM报"没有注册类" → 本机没有真Visio,走不了
- 必须在本地电脑模式,云电脑没有Visio
阶段1:理解流程
从输入(PPT/SOP/自然语言)提取:
| 要素 | 说明 |
|---|---|
| 节点 | 每个动作一个节点,文字简洁 ≤20字,超长换行。type: process/decision/document/data/start/end |
| 泳道 | 涉及多部门时启用,一个角色一条。常见:发起人、直属主管、行管、ST/AT、轮值CEO、经管中心、一级部门 |
| 列(col) | 时间阶段或步骤序号,从0开始整数 |
| 边(edge) | from/to 是节点id,decision节点出边带label(是/否) |
| x_offset | 同列多组垂直线时偏移用,±0.3~0.4,不越界即可 |
信息不足时停下来问用户,不要猜。
阶段2:写 flow.json
完整 schema 见 references/flow-template-lr.json。最小结构:
{
"title": "流程名称",
"swimlanes": ["泳道1", "泳道2", "泳道3"],
"nodes": [
{"id":"n1","text":"步骤一","type":"process","lane":"泳道1","col":0,"w":2.0,"h":0.8,"font_size":"11 pt"},
{"id":"n2","text":"是否通过?","type":"decision","lane":"泳道2","col":0,"w":1.3,"h":0.9,"font_size":"11 pt"},
{"id":"n3","text":"步骤二","type":"process","lane":"泳道3","col":1,"w":2.0,"h":0.8,"font_size":"11 pt"}
],
"edges": [
{"from":"n1","to":"n2"},
{"from":"n2","to":"n3","label":"是"}
]
}
硬约束:
- UTF-8 编码
- type 取值:start/end/process/decision/document/data
- 每个 node 的 lane 必须在 swimlanes 里
- edges 的 from/to 必须是已定义 id
- decision 节点出边必须带 label
阶段3:生成两个版本
$base = "<skill目录>"
$py = "C:\Users\oushihong\AppData\Local\Programs\Python\Python314\python.exe"
# 横向 LR 版
& $py "$base\scripts\visio_lr.py" flow.json "输出目录\流程图_横向.vsdx" --visible
# 纵向 TD 版(复制flow.json改节点位置逻辑即可,脚本自动处理)
& $py "$base\scripts\visio_td.py" flow.json "输出目录\流程图_纵向.vsdx" --visible
脚本自动:
- LR 版:泳道画成水平带(左侧标题格),节点按列从左到右排
- TD 版:泳道画成垂直列(顶部标题格),节点按行从上到下排
- Dynamic Connector 自动路由,直角连线,不穿框
阶段4:验收清单(必须检查3次)
生成后导出 PNG:
$visio = [System.Runtime.InteropServices.Marshal]::GetActiveObject("Visio.Application")
$visio.ActiveDocument.Pages.Item(1).Export("preview.png")
逐条核对(至少3次):
- [ ] 连线不穿框:从形状边缘进出,不穿过任何文字框内部
- [ ] 节点不越界:在泳道边界内,不超出左右/上下
- [ ] 文字不溢出:在框内,不被截断
- [ ] 对齐:同列节点垂直对齐,同行节点水平对齐
- [ ] 形状正确:红菱形=判断、白矩形=活动、黄折角=文档、绿圆角=起止
- [ ] 连线就近:同列直连,不绕远路
- [ ] 分支标签:decision 出边有"是/否"文字
发现穿框就调 x_offset 或改连接点,重新生成直到通过。
关键技术决策
- 绝不调用
page.Layout():Visio自动重排会打乱坐标 - 用 GlueToPos(x,y) 连接:(1.0,0.5)=右中, (0,0.5)=左中, (0.5,0)=底中, (0.5,1.0)=顶中
- RouteStyle=3:正交直角路由
- 手绘形状代替母版Drop:document母版填色失效,用 DrawPolyline 手绘五边形/菱形/平行四边形
- 生成前杀Visio进程:
Get-Process VISIO | Stop-Process -Force - Visio COM 必须 Visible=1:不能隐藏模式
文件结构
batf-visio-flowchart/
├── SKILL.md
├── scripts/
│ ├── visio_lr.py # 横向LR版生成脚本
│ └── visio_td.py # 纵向TD版生成脚本
└── references/
└── flow-template-lr.json # flow.json完整模板示例