SheetJS json_to_sheet导出ISO8601日期为字符串的问题求助
解决SheetJS导出ISO 8601日期为Excel可识别日期的问题
我太懂你这个糟心的问题了——明明设置了cellDates和dateNF,导出的日期还是冷冰冰的字符串,Excel完全不把它当日期处理对吧?核心原因其实很简单:SheetJS的cellDates参数只对原生Date对象生效,它不会自动把ISO格式的字符串转换成Date实例。
解决思路
咱们得先手动把JSON里的ISO日期字符串转成Date对象,再交给SheetJS处理。具体分两步走:
- 写一个数据预处理函数,批量把指定的日期字段转换成Date实例
- 在导出流程里先处理原始数据,再调用
json_to_sheet
修改后的完整代码
import { Injectable } from '@angular/core'; import * as FileSaver from 'file-saver'; import * as XLSX from 'xlsx'; @Injectable({ providedIn: 'root' }) export class ExportxlsService { fileType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8'; fileExtension = '.xlsx'; // 把所有需要转换的日期字段列在这里 private dateFields = ['created_at', 'fecha_ult_revision', 'fecha_sig_revision']; constructor() {} public exportExcel(jsonData: any[], fileName: string): void { // 先预处理数据,把ISO日期字符串转成Date对象 const processedData = this.convertDateStringsToDates(jsonData); const ws: XLSX.WorkSheet = XLSX.utils.json_to_sheet(processedData, { cellDates: true, dateNF: 'YYYYMMDD HH:mm:ss' }); const wb: XLSX.WorkBook = { Sheets: { data: ws }, SheetNames: ['data'] }; const excelBuffer: any = XLSX.write(wb, { bookType: 'xlsx', type: 'array' }); this.saveExcelFile(excelBuffer, fileName); } private convertDateStringsToDates(data: any[]): any[] { return data.map(item => { // 用扩展运算符复制对象,避免修改原始数据 const processedItem = {...item}; this.dateFields.forEach(field => { // 只处理存在且非空的字段 if (processedItem[field]) { processedItem[field] = new Date(processedItem[field]); } }); return processedItem; }); } private saveExcelFile(buffer: any, fileName: string): void { const data: Blob = new Blob([buffer], { type: this.fileType }); FileSaver.saveAs(data, fileName + this.fileExtension); } }
关键细节说明
dateFields数组:集中管理需要转换的日期字段,后续新增字段直接加在这里就行,不用改业务逻辑convertDateStringsToDates函数:通过map遍历数据,对每个对象的指定字段做转换,同时用{...item}保证原始数据不被修改- 转换后的
Date对象会被SheetJS正确识别,配合cellDates: true和dateNF配置,导出的Excel单元格会被标记为日期格式,用户就能正常进行排序、筛选、计算等日期相关操作了
这样处理后,你导出的Excel里的日期终于能被Excel正确识别啦!
内容的提问来源于stack exchange,提问作者Ernesto G
相关产品推荐
相关产品推荐

