在开发后台管理系统的时候, 遇到了需要 批量导入表格
的需求, 最终决定由前端来读取 Excel 表格, 将数据以 JSON 的格式发送给后端. 但是有一个坑点, 表格里面的一些 Date 类型的数据, 经过 js-xlsx 处理之后会存在毫秒级别的误差, 导致最终展现的日期不精确.
更新
[2020-12-24]
- Initial release
[2020-12-28]
Changed
- 更新代码, 要根据时区来转换日期
依赖版本
Name | Description | Version | Link |
---|---|---|---|
xlsx | 解析 Excel 表格 | 0.16.9 | https://github.com/SheetJS/sheetjs |
问题复现
js-xlsx 已经提供了 cellDates
可配置项, 用来处理日期:
1 | const workbook = XLSX.read(result, { |
但是, 使用这种方式会出现 43
秒的误差, 如下图所示:
由于 js-xlsx 内部会对 Excel 的日期数值进行 四舍五入
并且 保留三位小数
的操作, 所以会出现误差.
解决方案
由于 js-xlsx 读取到的 Excel 中的日期格式可能有两种:
- string: 也就是说 Excel 会把时间戳以文本形式原封不动的传递(
2021-12-20 16:00:00
) - number: Excel 内部会将诸如
2021-12-20 16:00:00
的日期转化为诸如44228.3756944444
的数值, 这个数值表示从1900
年至今的总天数, 如下图所示:
所以就需要分别对以上两种格式做处理, 首先要做的是关闭 cellDates
配置项:
1 | const workbook = XLSX.read(result, { |
接着格式化 “开服时间” 条目:
1 | typeof item["开服时间"] === "string" |