Excel 转 JSON

表格进、JSON 出。表头脏、日期串号、编号丢零这些坑都在选项里给堵住了,改一下选项结果立刻跟着变。

支持 xlsx、xlsm、xls 和 csv、tsv,也可以直接粘贴文件(Ctrl / Cmd + V)。多工作表的工作簿可在下面切换。全程在本机解析,表格不会上传。

选择 Excel 或 CSV 后开始转换

关于表格转 JSON

Excel 的表头经常不干净。真实表格里表头合并单元格、留空、重名都很常见。合并单元格只有左上角那一格有值,右边是空的;重名的话 JSON 对象只能保留一个键,后一个会覆盖前一个。所以这里做了两件事:空表头补成列标(A、B、C),重名自动加 _2、_3,同时在结果里给出提示。强烈建议转换前先在 Excel 里把表头整理成「一行、非空、不重名」。

日期为什么容易出错。Excel 把日期存成序列号,1900 年 1 月 1 日是 1。这里还埋了个历史包袱:为了兼容 Lotus 1-2-3,Excel 认为 1900 年是闰年,于是序列号 60 对应一个不存在的 1900-02-29。所以序列号 60 之前用 1899-12-31 当基准,之后用 1899-12-30。上面按「晚一天」处理,也就是 1 到 59 用一个基准,60 及以上用另一个,这样 2023 年 1 月 1 日对应 44927,和 Excel 里看到的一致。

哪些列必须当文本。身份证号 18 位,正好超出双精度浮点能精确表示的整数范围附近,而且 Excel 会把它显示成科学计数法;银行卡号、订单号、手机号、带前导零的编号(如 007)同样如此。这些列应该在选项里选「数字保持文本」,或者在 Excel 里先设成文本格式。反过来,金额、数量这类要参与计算的列就该保持数字,转成文本后程序还得再解析一次。

三种输出形状怎么选。「对象数组」是最通用的,每行一个对象,键是表头,几乎所有的 API 和程序都吃这个格式。「二维数组」只保留值不带键,体积最小,适合纯粹的数据搬运或喂给图表。「以首列为主键」适合配置表,输出成一个键值对字典,读取时按 key 直接取值,但要求首列的值唯一。

体积和精度。JSON 比 xlsx 大得多,因为每一行都要重复写一遍键名。几万行的表转出来可能有几十 MB,粘进编辑器会卡。需要更紧凑可以去掉缩进(压成一行),体积大约能减掉两三成。至于精度,JSON 的数字是双精度浮点,Excel 也是,所以只要不选「保持文本」,数值本身不会有额外损失。

转之前值得花两分钟做的事

先把表头整理干净:一行、不为空、不重名、没有合并单元格。合并单元格只有左上角那格有值,右边的都是空的,转出来会变成一堆 null;重名的列就只能保留一个。这两类问题在结果里都会提示,但提示出来时通常已经转完了,回头改表比先改表麻烦。

再把「不该参与计算的列」标出来:身份证号、银行卡号、手机号、订单号、带前导零的编号。这些列要么在选项里选「强制文本」,要么在 Excel 里就把列格式设成文本。工具本身只会按你选的规则走,它不知道哪一列是什么,这一层判断只有你知道。