如何用 CSV 创建组织结构图

如何把一份 HRIS 的 CSV 导出文件变成一张汇报线图:把 employee_id 和 manager_id 解析成行号,把经理列指向的方向反过来,并处理孤儿行和成环。

HRIS 导出文件把层级存成一个指针——每一行写明自己的经理,没有一行写明自己的下属——所以把它变成一张图,就是一次从标识符到行号的查找,外加一次方向反转。

简而言之

  • employee_id 和 manager_id 是标识符;连线到取的是从 1 开始的行号。转换就是一次查找。
  • manager_id 顺着树往上指,连线到顺着流程往下指——不反转过来,每一支箭头都会倒着走。
  • 一个在文件里找不到对应 employee_id 的 manager_id,说明导出被筛选过,而不是这个人没有上级。
  • 两行互相指向对方就是成环:往上走永远不会终止。请在文件里找出它,而不是在画布上。
  • 汇报线上的层级深度对应横向泳道列,于是每一级审批权限各占一条泳道。

一列 manager_id 到底给了你什么

HRIS 导出文件是一个纯文本文件,一行一个人:employee_id、manager_id、一个姓名、一个职位、一个成本中心,通常还有一两列描述这个人有权批准什么。层级确实在里面,但它被存成了一个指针。每一行写明自己的经理,没有一行写明自己的下属——这是在一张表里保存一棵树的正确做法,也正是这份文件粘贴一下并不会变成一张图的原因。

人们说“用 CSV 做组织结构图”时,指的其实是两种不同的图。一种是树:一个人一个方框,经理在下属上方,用来回答谁向谁汇报。QueryChart 有专门的组织结构图编辑器处理这种形状,而且那才是更合适的工具。另一种是把汇报线当成一条路线——一份申请从提出的人一路爬到有权签批的人所走过的路径——那是一张流程图,也正是本页要讲的。

转换是对导出文件做两个操作。第一个是查找:连线到这一列取的是从 1 开始的行号而不是标识符,所以一个填在单元格里的 E1042 什么都连不上。第二个是反转:manager_id 顺着树往上指,从子指向父;而连线到顺着流程往下指,从一行指向它通向的那些行。把文件弄成粘贴之后能活下来的样子,见 /zh/guides/流程图csv文件结构;同一批数据的纯父子版本在 /zh/templates/csv父子层级结构。

下面这个示例是一条用正是这类导出文件搭起来的审批链。它带着让真实 HRIS 数据变得棘手的三样东西:一行没有写明经理、一道防止申请人落在自己审批链上的保护,以及一位休假中、行上写着代理人的审批人。请打开下方的表格面板,挨着画布读连线到这一列。

把汇报线当成一条路线,而不是一棵树

从 HRIS 导出文件搭起来的审批链的四个完成度阶段。打开表格面板,看看填了哪些列。

  1. 读那一行,检查有没有经理

    开头几行只做一件事,读文件:“针对某个成本中心提出申请”,然后“从 HRIS 导出文件中读取申请人所在的行”,接着是菱形“这一行是否写明了经理?”。它的否分支通向“请人力资源团队修正汇报线”,因为一个空的 manager_id 首先是一个数据问题,其次才是一个路由问题。这个阶段只填了形状列,所以这些行还只是一份清单。

  2. 顺着 manager_id 往上走

    “顺着 manager_id 向上生成审批链”是真正干活的那一行,它后面三个菱形是这次向上行走所需要的检查。“申请人是否处在自己的审批链上?”拦住成环,“指定的审批人是否在岗?”把路由转到代理人,“是否在直属经理的审批权限之内?”决定一个签字是不是就到此为止。连线到现在装着行号,所以箭头存在了,但还没有任何东西说明哪个出口是哪个。

  3. 给上报分支贴标签

    连线文字按位置与连线到配对,所以“在权限之内,超出权限”把第一个数字送去签批,把第二个送到“上报部门负责人”。同一对标签在部门负责人那里重复一次,在总监那里再重复一次,而这就是你们的审批权限那一列早已编码好的上报阶梯。第 18 行以“是提交执行委员会还是撤回?”收尾。

  4. 加上两个泳道列

    横向泳道这一列承载汇报线上的层级——员工、直属经理、部门负责人、总监、执行委员会——于是组织树里的深度变成了画布上的横向距离。纵向泳道这一列承载职能:申请部门、财务、人力资源团队、总裁办。两者都填上之后,你就能读出人力资源团队只在导出文件出错时才出现,而财务只在这笔支出落在别的条线的成本中心上时才出现。

运作方式

  1. 把路由所依赖的那些列导出来

    你需要 employee_id、manager_id 和每个人一个可读的姓名。再加上职位、成本中心、审批权限和任何代理人列,因为决定一份申请爬到哪里为止的正是这些。凡是图上永远不会显示的都别导——薪酬、住址、入职日期——因为一份更窄的文件用眼睛核对起来容易得多,而且不认识的列本来就会被粘贴过程带过并忽略。

  2. 在电子表格之前,先把文件当文本读一遍

    先用文本编辑器打开这份导出文件。检查分隔符是逗号而不是分号,含逗号的姓名被双引号包住了,文件是 UTF-8 好让带重音的姓名活下来,以及第一个表头真的是 employee_id 而不是一个字节顺序标记后面跟着 employee_id。这些每一项都是悄无声息地失败:列是按表头名称匹配的,所以一个和你以为的不完全一样的表头,什么都匹配不上。

  3. 先决定你要做的是哪一种图

    一个人一个方框、按谁向谁汇报排布,那是一棵树,属于组织结构图编辑器。一份申请穿过汇报线所走的路径,那是一张流程图,属于这里:一行一个步骤而不是一行一个人,由导出文件提供层级、权限和代理人。请在开始给行编号之前就定下来,因为这两种形状彼此转换不过去。

  4. 把 manager_id 反转成行号

    先把这些行排成你想要的编号顺序,因为连线到指的是位置,事后重新编号会把一切重新接线。然后对每个人,把所有 manager_id 等于此人 employee_id 的那些行的行号收集起来,用逗号分隔填进这个人的连线到。下属成为向外的箭头;manager_id 只是查找用的键,它本身永远不会被粘进连线到。

  5. 在文件里解决孤儿行和成环

    按 manager_id 排序,确认每一个取值都在同一份文件里作为某个 employee_id 出现过。没出现的就是孤儿,通常是因为导出被限定在一个部门或只导了在职员工。然后顺着每条链往上走,一旦重新走到某一行就停下:两行互相指向对方就是成环,它要么是一个无人收尾的代理安排,要么是两行在同一天被不同的人改过。

  6. 粘贴进去,再补上形状和泳道

    把 .csv 拖到一张新图表的表格区域上,或者把 CSV 文本粘贴进去。把提问的那些行的形状设为决策,把终止行设为开始、成功和拒绝,把答案按与连线到数字相同的顺序填进连线文字,再把审批权限的层级填进横向泳道列,让汇报线上每一级各占一条泳道。

应避免的错误

  • manager_id 往上指,连线到往下指

    经理那一列写的是父节点;连线到那一列写的是后继。原封不动地把前者搬进后者,每一支箭头都会从一个人指向他的上级。破绽在组织的顶端:那里会变成从四面八方都有箭头指进来,一支出去的都没有。

  • employee_id 不是行号

    连线到读的是表格里的位置——编辑器左侧那一列数字——所以一个装着 E1042 或 00147 的单元格什么都连不上,也不会报错。请在导出文件里就把这次关联做完,把标识符换成位置,再粘贴。/zh/guides/在csv中定义流程图连线 把这一列讲得更细。

  • 导出文件里没有的经理

    一个在文件里找不到对应 employee_id 行的 manager_id 是一个孤儿,而它几乎从不意味着这个人没有经理。按部门限定的导出、只导在职员工的筛选,以及一位离职后从未记录继任者的人,都会造成它。整个组织最顶端的那个空值,是唯一合理的情形。

  • 电子表格悄悄改写了标识符

    带前导零的工号是典型的牺牲品:用电子表格打开这份 CSV,00147 就成了 147,于是一半的 manager_id 关联再也匹配不上,你得到的是一片一人一棵的小树林。请从原始文本着手,或者把 ID 那几列按文本导入,并把关联结果的行数和文件的行数比一比。

打开这个汇报线示例

把这个示例作为你自己的图表打开,看看这些列是怎么填的,然后在 employee_id 和 manager_id 解析成行号之后,把你自己的导出文件覆盖到这些行上。

打开这个汇报线示例

相关指南

常见问题

QueryChart 能直接导入一份组织结构图 CSV 吗?

把行弄进来的方式,是把 .csv 拖到表格区域上或者把 CSV 文本粘贴进去,而列是按表头名称而不是按位置匹配的,所以它们排成什么顺序都无所谓,不认识的任何东西都会被原样带过并忽略。它不会做的,是替你推断出一个层级:没有导入向导,没有列映射界面,也没有连接人力系统的连接器。文件必须已经在连线到这一列里说明了,每一行连向哪些行号。

我该用流程图编辑器还是组织结构图编辑器?

如果产出是一棵编制树——一个人一个方框、经理在下属上方、用来回答谁向谁汇报——请用专门的组织结构图编辑器,它就是为这种形状而做的,并且保证一个人只有一个父节点。当汇报线是一条路线而不是一张画时,请用流程图编辑器:一份一路上爬直到遇见权限足够的人的审批、一条上报路径、一份必须绕道财务的申请。这些里面有判断和例外,而判断不是一棵树画得出来的东西。

如果两个人互相汇报会怎样?

图会把它画出来——一对互相指着对方的箭头——但任何要把这条链一路走到顶的程序都不会终止,这也正是要在文件里而不是粘贴之后检查成环的原因。实际当中,成环要么是一个无人收尾的代理安排,要么是两行在同一天被不同的人改过。示例图用判断“申请人是否处在自己的审批链上?”防住了同一个问题在路由上的版本,它选择跳过一级而不是绕圈。

我的导出文件是分号分隔的,而且有些姓名含逗号。

两者对 HRIS 导出文件来说都很正常,而且都能在文件里解决。分号分隔的导出文件——系统按欧洲区域设置配置时很常见——应当重新导出或转换成逗号;就这么粘贴进来,整个表头行会落进一列,这至少还算是明显地失败而不是隐蔽地失败。含逗号的取值只要用双引号包住就是合法的,所以 "Nakamura, Yuki" 是一个字段,而同样的文字不加引号就成了两个。

HRIS 变了之后,怎么让图保持是最新的?

靠重新导出并重新粘贴,而不是把两者连起来——QueryChart 和人力系统之间没有实时链路。这件事没听上去那么要紧,因为你画的是路由规则而不是花名册:“金额超过直属经理权限时上报部门负责人”这条规则,能在一次让文件里每个名字都变了的重组中活下来。层级或者权限变了就重做导出,只有人变了就别去动它。

本指南所用的模板

CSV 组织结构图模板(按汇报线确定审批权限) — 把 HRIS 的 CSV 导出文件变成一张“谁能签什么”的流程图。manager_id 列变成一条升级阶梯,三个审批权限落在判断上,自批、代理和跨成本中心各有一条路线。

Browse all 组织结构图和公司结构指南

按汇报线确定审批权限(源自 HRIS 的 CSV 导出文件): 员工 → 直属经理 → 部门负责人 → 总监 → 执行委员会
如何用 CSV 创建组织结构图