组织架构图生成器
从 Excel 文件自动生成企业组织架构图,JPG 格式,黑框白底黑字。
触发条件
当用户提到以下意图时触发:
- "生成组织架构图"
- "生成部门架构图"
- "组织架构图"
- 提供 Excel 文件并要求生成组织架构图
输入要求
Excel 文件:包含部门层级信息,支持以下列名格式:
- 标准格式:一级部门、二级部门、三级部门、四级部门、五级部门
- 简写格式:1级部门、2级部门... 或 L1、L2、L3...
- 自由格式:包含"部门"关键词的列,按出现顺序视为层级
输出:组织架构图.jpg(与源文件同目录)
执行步骤
步骤1:读取 Excel 文件并检测列名
import pandas as pd
import re
df = pd.read_excel(excel_path)
# 自动检测层级列
def detect_hierarchy_columns(df):
"""自动检测Excel中的层级列"""
columns = df.columns.tolist()
hierarchy_cols = []
# 模式1: "X级部门" 或 "第X级"
pattern1 = re.compile(r'(第)?[一二三四五六七八九十\d]+级\s*部门')
# 模式2: "L1", "L2" 等
pattern2 = re.compile(r'^L\d+$|^Level\d+$', re.IGNORECASE)
# 模式3: 包含"部门"的列,按顺序排列
dept_cols = [col for col in columns if '部门' in col]
# 优先使用模式1
for col in columns:
if pattern1.search(col):
hierarchy_cols.append(col)
# 如果模式1没找到,尝试模式2
if not hierarchy_cols:
for col in columns:
if pattern2.search(col):
hierarchy_cols.append(col)
# 如果还没找到,使用包含"部门"的列
if not hierarchy_cols:
hierarchy_cols = dept_cols
# 按列索引排序(保持原始顺序)
hierarchy_cols.sort(key=lambda x: columns.index(x))
return hierarchy_cols
hierarchy_cols = detect_hierarchy_columns(df)
print(f"检测到层级列: {hierarchy_cols}")
步骤2:构建层级树
def build_tree(df, hierarchy_cols, root_name="公司组织架构"):
"""根据检测到的层级列构建树结构
Args:
df: DataFrame
hierarchy_cols: 层级列名列表
root_name: 根节点名称(公司名称)
"""
tree = {"name": root_name, "children": []}
for _, row in df.iterrows():
current = tree
for col in hierarchy_cols:
if pd.notna(row[col]):
dept_name = str(row[col])
# 查找是否已存在该节点
child_node = next((item for item in current["children"]
if item["name"] == dept_name), None)
if child_node is None:
child_node = {"name": dept_name, "children": []}
current["children"].append(child_node)
current = child_node
return tree
步骤3:生成组织架构图
文字排版规则:
- 第0级(根节点):横排文字(公司名称,大字体)
- 第1级(一级部门):横排文字(中等字体)
- 第2级及以下:竖排文字(每个字符一行,小字体)
使用以下参数生成 JPG 图片:
| 参数 | 值 | 说明 |
|---|---|---|
| 格式 | JPG | 质量 95 |
| 配色 | 黑框白底黑字 | 边框宽度 2px |
| 文字方向 | 第0级横排,其他竖排 | 竖排:每个字符一行 |
min_gap |
220px | 节点间最小水平间距 |
line_gap |
80px | 连接线与边框最小间隙 |
node_width_vertical |
110px | 竖排节点宽度 |
char_height |
28px | 字符高度 |
padding |
30px | 内边距 |
关键算法:
- x坐标:树形布局算法(根据子树叶子数分配空间)
- y坐标:每个分支独立计算,自顶向下递归
- 连接线位置 = 父节点底部 + 80px
- 子节点顶部 = 连接线位置 + 80px
- 从数学上保证不压线
步骤4:执行生成脚本
# 脚本路径
script_path = "{workspace}/.workbuddy/skills/org-chart-generator/scripts/generate_org_chart.py"
# 执行(支持自定义根节点名称)
python excel_path [root_name] [output_path]
输出文件
- 主输出:
{与Excel同目录}/组织架构图.jpg - 日志:打印画布大小、节点数量、执行时间
错误处理
- 未检测到层级列:提示用户检查 Excel 格式
- 字体文件不存在:使用默认字体
- 图片过大:提示用户图片宽度可能超过 30000px(正常现象)
示例
用户输入:
@skill:org-chart-generator @"D:/部门架构/公司部门架构.xlsx" "XXX企业有限公司"
执行流程:
1. 检测 Excel 中的层级列(一级部门、二级部门...)
2. 构建层级树(根节点为 "XXX企业有限公司",189 个节点)
3. 生成 JPG 图片(30930 × 2358 px)
4. 保存到 D:/部门架构/组织架构图.jpg
技术细节
- 布局算法:改进的 Reingold-Tilford 算法
- 防压线机制:
line_gap = 80px,连接线上下各有 80px 间隙 - 字体:
C:/Windows/Fonts/simhei.ttf(黑体) - 依赖库:
pandas,Pillow
限制
- Excel 文件必须包含至少 2 个层级列
- 图片宽度可能非常大(超过 30000px),这是正常的
- 仅支持 JPG 格式输出