关于解析Excel中的日期出现是数字序列的问题

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

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

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

第一种方式得到的是一个 1900-01-01 00:00:00 开始的序列号。

复制代码
export function formatExcelDate(excelSerialDate) {
  //  25569 是 1970-01-01 对应的 Excel 序列号, Excel 时间起点:1900-01-01 00:00:00 , JS 时间起点:1970-01-01 00:00:00
  // 86400 * 1000 = 一天的毫秒数
  // console.log(new Date(Math.round((excelSerialDate - 25569) * 86400 * 1000)))
  return new Date(Math.round((excelSerialDate - 25569) * 86400 * 1000));
}

1. 为什么需要 excelSerialDate - 25569

excelSerialDate - 25569 目的是得到1970年1月1日至被计算的日期(excelSerialDate)相差了多少天。

2. 25569 表示1900-01-01 到 1970-01-01 有多少天,如何计算的

70年 × 365天 = 25550 天

加上闰年(1904,1908,...,1968)共 17 天

加上 Excel 闰年 bug(1900被误认为闰年)1 天

加上第1天从1开始而不是0的偏移 1 天

总计:25550 + 17 + 1 + 1 = 25569 天

3. Math.round 的作用

由于JS 使用 IEE 754 双精度浮点数表示数字,有些乘法会产生不准确的结果。

例如: 0.1 + 0.2 = 0.30000000000000004

为了解决精度问题,所以使用 Math.round 四舍五入。

4. 为什么需要转成 JS Date

JS Date 使用毫秒时间戳,所以使用 excelSerialDate - 25569 计算出从 JS 时间起点(1970-01-01)到目标日期的天数,然后乘以一天的毫秒数就得到了 JS 时间戳。

测试

复制代码
// 使用示例
const excelDate = 46170;
const jsDate = excelDateToJSDate(excelDate);
console.log(jsDate); // 2026-05-28T00:00:00.000Z

第二种方式得到是一个Date类型的数据

相关推荐
wtsolutions21 小时前
Excel-to-JSON本地化Excel插件发布 - 在Excel中安全离线转换数据
安全·json·excel
用户2986985301421 小时前
Python 实现 Excel 与 TXT 文本的高效转换与导出
后端·python·excel
程序员小郭831 天前
Java + POI 实现高性能Excel导出(支持普通List、MyBatis Cursor流式导出、VO适配)
spring boot·后端·excel
AI导出鸭PC端3 天前
告别导出难题:AI 导出鸭助力 Claude 输出 excel 一站式实现
人工智能·ai·excel·豆包·ai导出鸭
Am-Chestnuts3 天前
DeepSeek 表格如何导出 Word/Excel:Markdown 表格、CSV 与 DS随心转方案对比
word·excel
城数派3 天前
2000-2026年我国省市县三级逐月NDVI数据(Shp/Excel格式)
excel
许彰午4 天前
74_Python自动化办公之Excel操作
python·自动化·excel
E_ICEBLUE4 天前
在 Python 中快速锁定 Excel 单元格与行列
python·安全·excel
Non-existent98721 天前
WPS批量清理单元格空白字符的4种方法-异常数字格式处理-实战
excel·wps
Channing Lewis21 天前
PHP 解析 Excel 的那些坑:一次“行号错位”引发的数据丢失
开发语言·php·excel