乐趣区

关于javascript:XLSXjs解析Excel遇到的问题

应用 xlsx.js 读取 Excel 中的日期有两种形式:

  1. XLSX.read(file, { type: 'binary'})
  2. XLSX.read(file, { type: 'binary', cellDates: true})

通过第一种形式读取日期,解析后果是 Excel 中保留的数字(Excel 会将日期保留为数字。例如,将 2020/09/30 由日期格局改成文本格式时,会失去一个 44104 这样的数字,它代表的是从 1900/01/01 开始,到该日期的天数。)

拿到这个数字后,通过 moment.js 对其进行格局转化:

moment('1900/01/01').add(moment.duration({ 'days': 44104 - 1})).format('YYYY/MM?DD')
// => 2020/10/01

然而失去的日期会比理论日期 2020/09/30 多一天,具体起因是因为在 Excel 中, 1900 年被谬误地当成了平年,1900/02/28 前面的日期对应的数字比理论多了 1900/02/29 这一天。须要在进行非凡解决:

const START_TIME = '1900/01/01'
const FORMAT = 'YYYY/MM/DD'
export const formatExcelDate = (num) => {
 let duration = num - 1
 // 1900/2/29 的 num 为 60
 if (num > 60) {
 // 对于 num 大于 60 的需解析日期, 要减去多的 1900/2/29 日的那一天
 duration = num - 2
 }
 return moment(START_TIME).add(moment.duration({ 'days': duration})).format(FORMAT)
}
​
formatExcelDate(44104) // => 2020/09/30

通过第二种形式读取日期,解析后果是一个日期对象。

个别状况下,对于 1901/01/01 以前的日期如 1900/02/05,会解析为 Sun Feb 04 1900 00:05:00 GMT+0805 (中国规范工夫),对于 1901/01/01 及当前的日期如 2020/05/20,会解析为 Tue May 19 2020 23:59:17 GMT+0800 (中国规范工夫),为何会有 GMT+0805 (中国规范工夫)?。

能够看到 1901/01/01 后的解析日期比理论晚了 43 秒,具体起因未知。还有另外一个问题就是,同一日期在不同电脑上解析的后果不统一,起因临时未知。

退出移动版