Excel 转 JSON 工具
上传 Excel 文件,将表格数据转换为 JSON 格式
拖放 Excel 文件到此处,或点击选择文件
什么是 Excel 转 JSON?
Excel 转 JSON 是一个在线数据格式转换工具,可以将 Microsoft Excel(.xlsx/.xls)文件中的表格数据转换为 JSON(JavaScript 对象表示法)格式。Excel 是全球最流行的电子表格软件,广泛用于数据存储、分析和报表制作。JSON 是现代 Web 应用和 API 中最常用的数据交换格式,具有结构清晰、易于解析的优点。使用本工具,您可以快速将 Excel 表格数据转换为 JSON 数组,方便在编程、数据分析和 Web 开发中使用。所有处理均在浏览器本地完成,确保数据安全。
使用方法
使用步骤
- 点击上传区域或将 Excel 文件拖入(支持 .xlsx 和 .xls 格式)
- 如包含多个工作表,请从下拉菜单中选择需要转换的工作表
- 选择是否将第一行作为 JSON 对象的字段名
- 格式化后的 JSON 数据将自动生成,可直接复制
电子表格注意事项
- 在使用生成的 JSON 前,请检查所选工作表、表头行、合并单元格、空行以及日期格式。
- 电子表格常常同时包含显示格式与原始值,转换后请核对数字和日期。
使用场景
技术原理
现代 .xlsx 工作簿是由 ECMA-376 / ISO/IEC 29500(Office Open XML 标准)定义的 SpreadsheetML 文件:.xlsx 扩展名是一个 ZIP 容器,其内部条目是 XML 文档,位于 xl/worksheets/sheetN.xml,字符串存储在共享字符串表 xl/sharedStrings.xml 中,单元格类型由 t 属性声明(s = 共享字符串,n = 数字,b = 布尔值,str = 内联字符串,d = ISO 8601 日期)。页面使用 FileReader.readAsArrayBuffer 读取上传的 File,然后将 ArrayBuffer 交给 SheetJS(xlsx)处理。XLSX.read(buffer, {type: 'array'}) 返回一个工作簿对象,其 SheetNames 数组驱动工作表选择器,XLSX.utils.sheet_to_json(sheet, options) 遍历单元格网格,生成以表头行为键的对象数组,或传入 header: 1 时生成数组的数组。 旧版 .xls 是二进制 BIFF8 格式(Excel 97-2003),SheetJS 同样通过相同的 read() 入口解码,但使用 type: 'binary'(对应 FileReader.readAsBinaryString)或读取字节时使用 'array'。两种格式的单元格日期值均以序列号存储(Excel 中自 1900 纪元以来的天数,存在历史性的 1900-02-29 闰年 bug,使 1900-03-01 之前的日期偏移一天;当工作簿在 Mac 版 Excel 中设置了 date1904 标志时,以 1904-01-01 为纪元)。转换为 JavaScript Date 的公式为(序列号 - 25569)* 86400 * 1000 毫秒(自 Unix 纪元起),适用于考虑闰年 bug 后的 1900 系统。公式存储在 f 属性中,SheetJS 在 v 中报告其最后缓存结果;如果工作簿由未重新计算的工具保存(例如某些脚本导出),v 可能缺失或过期。 当首行用作表头时,重复或空的表头单元格会迫使 SheetJS 跳过或自动重命名键(如 __EMPTY、__EMPTY_1),这会破坏下游 JSON 契约。合并单元格范围(在 worksheet/mergeCells 中声明)仅在左上角锚点处暴露值,在合并尾部单元格中输出 undefined,因此合并的标题行会产生一条有值的记录和 N - 1 条稀疏记录。对于超过数十兆字节的工作簿,同步的 XLSX.read() 路径可能阻塞 UI 线程;流式替代方案是将解析移入 Web Worker,使主线程保持响应。
- .xlsx 是 XML 的 ZIP 容器(ECMA-376 / ISO/IEC 29500);.xls 是二进制 BIFF8 格式;SheetJS XLSX.read(buffer, {type: 'array'}) 通过 FileReader.readAsArrayBuffer 处理两者。
- sheet_to_json 选项:header: 1 返回数组的数组;header: 'A' 使用电子表格列字母;defval: null 用 null 填充稀疏单元格而非丢弃键;raw: false 应用 Excel 显示格式。
- Excel 日期序列号是自 1900-01-01 以来的天数(含 1900-02-29 闰年 bug;Mac 1904 日期系统为自 1904-01-01 以来的天数);JS Date 毫秒 =(序列号 - 25569)* 86400000(自 Unix 纪元起)。
- 重复或空的表头单元格变为自动重命名的键(__EMPTY、__EMPTY_1)或静默冲突;在依赖 schema 之前,验证 JSON 中是否包含这些字符串。
- 合并单元格范围(worksheet.mergeCells)仅在左上角锚点暴露值;合并中的尾部单元格为 undefined,因此合并的标题行产生一条有值的记录和 N-1 条空字段的记录。
- 公式单元格在 f 中存储表达式,在 v 中存储最后缓存结果;不重新计算就保存的工具会使 v 过期或缺失,SheetJS 原样返回 v。
- 对于超过约 10 MB 的工作簿,将 XLSX.read 移入 Web Worker;同步解析路径会阻塞 requestAnimationFrame,大工作表可能使标签页冻结数秒。
示例
员工表转 JSON 对象数组
Excel 行(Staff 工作表):
id | name | dept | salary
1 | Alice | Engineering| 8500
2 | Bob | Sales | 6200
JSON 输出:
[
{ "id": 1, "name": "Alice", "dept": "Engineering", "salary": 8500 },
{ "id": 2, "name": "Bob", "dept": "Sales", "salary": 6200 }
]多工作表工作簿(orders.xlsx)
工作簿包含工作表:["Customers", "Orders", "Products"]
选择工作表:Orders
首行作为表头:order_id, customer_id, total, date
结果:1,284 行被转换为 JSON 对象
末尾空单元格输出为 null,而不是空字符串Excel 日期单元格转 ISO 8601 字符串
单元格 A2(Excel 日期格式):46173(Excel 序列号)
Excel 中显示为:2026-06-01
JSON 输出:
{ "order_date": "2026-06-01T00:00:00.000Z" }
说明:Excel 用数字序列存储日期,本工具会统一转换成 ISO 字符串含空格和中文的表头
表头:"Order No." | "客户姓名" | "金额 (USD)"
JSON 键完整保留:
{
"Order No.": "A-1024",
"客户姓名": "王小明",
"金额 (USD)": 199.50
}常见问题
我的 Excel 文件会被上传吗?
不会。.xlsx、.xls 或 .csv 文件由 SheetJS 在你的浏览器中解析,文件字节不会离开本机。可在加载文件时打开 Network 面板自行核实。
转换后哪些 Excel 特性会被保留?
保留单元格的值、日期(按选项输出 ISO 字符串或 Excel 序号)、数字、布尔值和文本。图表、图片、条件格式、公式(仅保留缓存的计算值,不保留公式本身)、批注和合并单元格会被丢弃或简化。
所有工作表都会被转换吗?
只转换所选的工作表。请通过下拉菜单选择要导出的工作表。如需多个工作表,可逐个转换。
表头与数据行如何映射到 JSON?
若开启「首行为表头」,结果是以表头单元格为键的对象数组;关闭则输出二维数组(每个元素是单元格值组成的数组)。空单元格在输出中表示为 null。
日期是如何处理的?
Excel 内部用序列号存储日期(自 1900 年以来的天数)。本页默认转换成 ISO 8601 字符串(如 2026-06-13)。切换到「原始」可保留序列号,便于稍后再导回 Excel。仅含时间的单元格会输出为 'T14:30:00' 之类的字符串。
公式会被计算吗?
不会重新求值,只读取上次保存时缓存的计算结果。如果需要最新结果,请先在 Excel 中打开文件,按 F9 重算并保存,然后再上传。
文件大小有上限吗?
受浏览器内存限制。现代台式机一般可处理几百 MB 的工作簿。对于超大文件(百万行以上),请改用桌面脚本工具(Python pandas、Excel Power Query)——浏览器会出现内存溢出。