CSV 还是 Excel:用哪种文件做流程图

CSV 是一张纯文本的表,没有公式、没有第二张工作表、没有格式。Excel 三样都有,却很少是系统真正导出的东西。该用哪种文件做流程图,以及各自的代价。

运作方式

  1. 先弄清楚你手上到底是哪种文件

    如果这条流程来自一个系统,那么不管图标显示成什么,你手上的是一份 CSV,而你能对它做的最安全的事就是不要用 Excel 打开它。如果这条流程是有人手工敲出来的,那你手上的是一个工作簿,而且里面会有合并单元格。这两个起点需要不同的第一步,而把一份导出文件当工作簿对待,正是让你的产品编码变成日期的原因。

  2. 在电子表格之前,先用文本编辑器打开这份 CSV

    看它的前两行。它们会告诉你分隔符、字段有没有加引号,以及第一个表头名称前面有没有 UTF-8 字节顺序标记留下的三个看不见的字节。这三十秒省下的是那两种看着像软件缺陷、其实不是的故障:一份文件导进来变成一整列,以及第一列因为表头不再匹配而被悄悄忽略。

  3. 如果源头是 Excel,就把它拍平成一张表

    把这张工作表按值粘回它自己,让每个公式都变成它算出来的字符串。取消所有合并,删掉表头上面的标题块,删掉空白分隔行,并把任何以填充色或加粗编码的信息移进一个真正的列里,因为这些都活不过这趟旅程。一行表头,一行一个步骤,一张工作表。CSV 按定义就是一张表,所以这一步正是让两个源头等价起来的那一步。

  4. 把连接列加成行号

    连线到装的是每一行所连向的那一行从 1 开始的编号,多于一个时用逗号分隔;连线文字按同样的顺序装连线标签。在一个逗号分隔的文件里,这两个单元格都必须加引号——“5,6”和“是,否”——否则这一行会比表头多出一个字段,它之后的每一列都往左挪。这是两种格式里唯一真正需要你补充的新数据。

  5. 把它导入进来

    把 .csv 拖到编辑器的表格区域上,或者把 CSV 文本直接粘贴进去。列是按表头名称匹配的,所以它们在你文件里的顺序无关紧要,任何不被识别的东西都会被原样带过并忽略。从工作簿过来的话,要么选中区域粘贴进去,要么先把工作表另存为 CSV——工作表里但凡有什么不寻常的东西,后者都值得做一次,因为另存为 CSV 会让你看见到底有什么活了下来。

  6. 检查那三件只朝一个方向出错的事

    丢了前导零的编码、变成了日期的取值,以及文件中间某处开始整体错位的一列。三者都来自一份 CSV 被某个会猜的程序解析过,而三者在你专门去找之前都是看不见的。请在行里修正它们,而不是回去修原始导出文件,因为从这一刻起图表就是正本,文件是一份快照。

常见问题

做流程图该导出 CSV 还是 XLSX?

源系统本来产出什么就用什么,实际上也就意味着 CSV。把一份导出文件转成工作簿,会多加一个只可能丢信息的解析环节,而你换来的那些工作簿特性——公式、类型、第二张工作表——在一行能变成一个方框之前,全都得先归结成普通的值。只有一种情况 Excel 是更好的选择:这条流程还不存在于任何地方,你正在手工把它写出来,因为一个把步骤编码变成行号的公式,确实比手工做要快。那条路径在 /zh/guides/从电子表格创建流程图 里讲。行一旦定下来,这两种格式就完全合流了。

流程图真正需要的东西,CSV 会丢掉吗?

不会。一张图赖以搭起来的每一列都是文本:标签、连线到里的行号、连线文字里的连线标签、形状名,以及两个泳道名。这些都不需要类型、公式或第二张工作表,所以一份 CSV 能完整地承载一张流程图,什么都不缺。CSV 丢掉的是图周围的一切——格式、批注里的说明、下一个标签页上的透视表、那一列是算出来而不是存下来的。如果这些里有任何一样对你们的流程是受力构件,那它就是被编码在数据之外的含义,而它必须在导出之前而不是之后变成一列。

我打开文件之后,产品编码为什么变了?

因为 CSV 没有类型,而打开它的程序只能猜。一个写着 00742 的字段,在文件里就是这五个字符;Excel 把它读成一个数字,丢掉前导零,显示 742,而你如果在这时保存,文件本身现在就写着 742 了。同一种猜测把 3-4 变成日期,把一个很长的数字编码变成科学计数法,还会按打开它的人的区域设置去重新解释 01/02。这份文件在被查看之前一直是对的。请直接导入这份 CSV,而不要让它绕一趟电子表格;如果你非得打开,就把那些列按文本导入。

好几个人一起维护这条流程时,哪种格式更好?

CSV,只要这条流程还住在一个文件里就是。它是纯文本,所以能逐行 diff、能 grep、能合并,放进版本控制里能准确显示两个修订之间改了哪些步骤。而 .xlsx 是一包压缩的 XML:改一个单元格会重写归档里的大部分内容,所以 diff 只能告诉你文件变了,别的什么都说不出。话虽如此,导入之后这个答案就不再要紧了,因为图表成了正本,它自己的修订历史接管了这件事。把 CSV 当成一份大家也在改的并行副本留着,会重新引入你当初做转换正是为了终结的那种偏差。

我的列从一行中间开始整体挪位了,出了什么事?

几乎总是逗号分隔文件里一个没加引号的半角逗号。这一行是在任何东西去看表头之前就按分隔符切开的,所以一个装着 4,5 的连线到单元格会被读成两个字段,这一行比表头多出一个字段,它之后的每一列都落到了邻居的表头下面。把这些单元格用双引号包起来,解析器就会把它们放回去。连线文字以及任何含半角逗号的标签,比如一个产品名,也同理。如果错位是从第一列而不是中间开始的,原因就不同了:这份文件是分号分隔的却被当成逗号分隔来读,或者有一个字节顺序标记黏在第一个表头名称上,让它匹配不上了。

流程图指南中的更多内容