使用xlsx库将CSV转JSON时日期格式转为数字的问题及需求
问题
需求:将指定CSV文件转换为JSON时,保留date和newdate列的原日期格式(如2022-01-01、01/02/2022)。
CSV内容:
id,name,date,newdate 1,John,2022-01-01,01/02/2022 2,Mary,2022-02-15,02/02/2022
当前使用xlsx库(import * as XLSX from 'xlsx')的实现代码:
fileReader.onload = (e) => { const csvData = e.target.result; const workbook = XLSX.read(csvData, { type: 'string' }); const sheetName = workbook.SheetNames[0]; const options = { header: 1, raw: true }; // specify the raw option here const data = XLSX.utils.sheet_to_json(workbook.Sheets[sheetName], options); console.log('data', data); }
执行后结果中日期列被转为Excel序列号(如44562.22928240741),请问为何会出现这种情况?如何实现保留原日期字符串格式的转换?
原因分析
- xlsx库默认会自动识别CSV中的日期格式内容,将其转换为Excel内部使用的日期序列号(这是Excel存储日期的标准机制)。
- 你设置的
raw: true参数,作用是保留单元格解析后的原始值,但这里的“原始值”指的是库解析后的Excel格式值,而非CSV里的原始文本。因为库在读取CSV阶段就已经完成了日期解析,raw参数无法回溯到CSV的原始字符串状态。
解决方案
要保留CSV中的原始日期字符串,核心是在读取CSV时禁用日期解析功能,具体修改如下:
修改后的代码
fileReader.onload = (e) => { const csvData = e.target.result; // 读取CSV时添加参数禁用日期解析 const workbook = XLSX.read(csvData, { type: 'string', cellDates: false, dateNF: false }); const sheetName = workbook.SheetNames[0]; const options = { header: 1 }; const data = XLSX.utils.sheet_to_json(workbook.Sheets[sheetName], options); console.log('data', data); }
参数说明
cellDates: false:阻止库将识别到的日期转换为日期对象或Excel序列号,强制保留原始内容。dateNF: false:关闭日期格式的自动识别逻辑,确保CSV中的日期字符串不会被解析转换。
经过上述修改,date和newdate列就会保持CSV里的原始日期格式,不会被转为Excel序列号。
内容的提问来源于stack exchange,提问作者unnonusr
相关产品推荐
相关产品推荐

