导出JSON为XLSX时如何为不同列指定不同dateNF
问题
现有如下数据:
[{billDate: "21-1-2021", createdDate: "20-2-2021", modifiedDate: "20-2-2022"}, ...]
我已将日期字符串转换为JS Date对象,现在使用XLSX.utils.json_to_sheet导出工作表时,需要为不同列指定不同的dateNF格式:
- billDate列用
dd-mm-yyyy格式 - createdDate和modifiedDate列用
mm-dd-yyyy格式
我尝试了两种方式,但都未达到预期:
方式1:columns配置
// 结果:dateNF设置完全无效 XLSX.utils.json_to_sheet(data, { columns: [{ name: "billDate", key: "billDate", dateNF: "dd-mm-yyyy" }, { name: "createdDate", key: "createdDate", dateNF: "mm-dd-yyyy" }] });
方式2:结合header属性的配置
// 结果:先出现3列内容为"[object Object]"的列,后续才是原始数据列 XLSX.utils.json_to_sheet(data, { header: [{ name: "billDate", key: "billDate", dateNF: "dd-mm-yyyy" },{ name: "createdDate", key: "createdDate", dateNF: "mm-dd-yyyy" }] });
解决方案
XLSX.utils.json_to_sheet的columns选项不支持为单独列指定dateNF,需要分两步实现差异化日期格式:
- 先导出基础工作表,定义列顺序与表头
- 遍历目标列,为每个日期单元格单独设置显示格式
具体代码示例:
// 1. 导出基础工作表,指定列顺序和表头 const ws = XLSX.utils.json_to_sheet(data, { columns: [ { name: "billDate", key: "billDate" }, { name: "createdDate", key: "createdDate" }, { name: "modifiedDate", key: "modifiedDate" } ] }); // 2. 定义各列对应的日期格式 const columnFormats = { billDate: "dd-mm-yyyy", createdDate: "mm-dd-yyyy", modifiedDate: "mm-dd-yyyy" }; // 3. 映射列名到工作表的列索引 const headerRow = XLSX.utils.sheet_to_json(ws, { header: 1 })[0]; const columnMap = Object.keys(columnFormats).reduce((map, key) => { map[key] = headerRow.indexOf(key); return map; }, {}); // 4. 遍历所有数据行,为日期单元格设置格式 const range = XLSX.utils.decode_range(ws['!ref']); for (let row = range.s.r + 1; row <= range.e.r; row++) { Object.entries(columnMap).forEach(([key, colIndex]) => { const cellAddr = XLSX.utils.encode_cell({ r: row, c: colIndex }); const cell = ws[cellAddr]; // 判断是否为日期类型单元格 if (cell && cell.t === 'd') { // 将JS日期转为Excel序列号,设置显示格式 cell.v = XLSX.utils.date_to_excel(cell.v); cell.z = columnFormats[key]; } }); }
关键说明
- Excel的日期本质是带显示格式的数字,通过单元格的
z属性指定格式 - 先导出工作表后,通过修改
z属性实现不同列的格式差异化 - 若数据已转为JS Date对象,
XLSX.utils.date_to_excel会自动转换为Excel兼容的序列号
内容的提问来源于stack exchange,提问作者Sumit M
相关产品推荐
相关产品推荐

