Node.js中SheetJS处理XLSX日期格式化问题咨询
SheetJS + @json2csv/plainjs 日期格式化问题解决方案
1. 该场景下是否支持传入自定义日期格式?
完全支持,核心是先将带时分秒的日期字符串转换为标准Date对象,或通过@json2csv的格式化规则预处理,再交给SheetJS识别为日期类型,两种方法任选其一:
方法一:用@json2csv预处理日期
通过formatters配置把日期字符串转成Date对象,确保SheetJS能识别为日期类型:
const { Parser } = require('@json2csv/plainjs'); const XLSX = require('xlsx'); const data = [ { date: "3/21/2024 4:15:00 PM", value: 1 }, { date: "3/22/2024 9:30:00 AM", value: 2 } ]; // 用@json2csv将日期字符串转为Date对象 const json2csvParser = new Parser({ formatters: { date: (input) => new Date(input) } }); const csv = json2csvParser.parse(data); // 将处理后的csv转为xlsx const workbook = XLSX.read(csv, { type: 'string' }); XLSX.writeFile(workbook, 'output.xlsx');
方法二:直接用SheetJS处理数据
跳过@json2csv,手动构造工作表数据时转换日期并标记类型:
const XLSX = require('xlsx'); const data = [ { date: "3/21/2024 4:15:00 PM", value: 1 }, { date: "3/22/2024 9:30:00 AM", value: 2 } ]; // 转换为SheetJS可识别的格式,t='d'标记为日期类型 const wsData = [['Date', 'Value'], ...data.map(item => [ { t: 'd', v: new Date(item.date) }, item.value ])]; const worksheet = XLSX.utils.aoa_to_sheet(wsData); const workbook = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); XLSX.writeFile(workbook, 'output.xlsx');
2. 能否传入带时分秒的日期数据,却在Excel中仅显示时间部分?
可以,通过设置SheetJS单元格的z属性(数字格式)实现:单元格存储完整的日期时间数据,但仅显示时间部分。
const XLSX = require('xlsx'); const data = [ { date: "3/21/2024 4:15:00 PM", value: 1 }, { date: "3/22/2024 9:30:00 AM", value: 2 } ]; const wsData = [['Date', 'Value'], ...data.map(item => [ { t: 'd', v: new Date(item.date), z: 'h:mm AM/PM' // 指定Excel仅显示时间格式 }, item.value ])]; const worksheet = XLSX.utils.aoa_to_sheet(wsData); const workbook = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); XLSX.writeFile(workbook, 'output.xlsx');
双击单元格仍能看到完整的日期时间,但单元格默认只显示时分秒与上午/下午标识。
如果要结合@json2csv使用,可先生成完整日期的csv,再用SheetJS读取后修改单元格格式:
const XLSX = require('xlsx'); const { Parser } = require('@json2csv/plainjs'); const data = [ { date: "3/21/2024 4:15:00 PM", value: 1 }, { date: "3/22/2024 9:30:00 AM", value: 2 } ]; const json2csvParser = new Parser({ formatters: { date: input => new Date(input) } }); const csv = json2csvParser.parse(data); const workbook = XLSX.read(csv, { type: 'string' }); const worksheet = workbook.Sheets[workbook.SheetNames[0]]; // 遍历日期列(假设是A列)设置时间显示格式 for (let cell in worksheet) { if (cell.startsWith('A') && cell !== 'A1') { worksheet[cell].z = 'h:mm AM/PM'; } } XLSX.writeFile(workbook, 'output.xlsx');
内容的提问来源于stack exchange,提问作者Juan David Ruiz Cohen
相关产品推荐
相关产品推荐

