必须改用sheetjs手动构造.xlsx并设日期格式,因table.exportfile()仅导出无格式csv,无法识别时间戳或iso字符串,需将日期字段转为js date实例并设置单元格格式代码如"yyyy-mm-dd"。
导出 excel 时日期变成时间戳或数字?
直接调用 table.exportfile() 导出 excel,日期列显示为 1712345678000 或 45183 这类数字,不是因为你后端传错了,而是 layui 默认不做类型转换——它把字段值原样写进单元格。excel 无法识别 js 时间戳或 iso 字符串,只能当普通数值处理。
- 后端返回的是秒级时间戳(如
1712345678)?前端导出前必须乘以1000转成毫秒再构造Date实例 - 后端返回的是字符串
"2024-04-05"?Safari 下new Date("2024-04-05")可能失效,建议先替换连字符:new Date(d.applytime.replace(/-/g, '/')) - 字段为空(
null、undefined或字符串"null")?不判断就调new Date()会报错,务必加短路逻辑
用 SheetJS 手动导出并设日期格式
想真正控制 Excel 单元格格式(比如 yyyy-mm-dd),必须绕过 table.exportFile(),改用 xlsx 库手动构造工作表。关键点只有两个:数据是 Date 实例,且明确设置单元格格式。
- 引入完整版 SheetJS:
<script src="https://cdn.sheetjs.com/xlsx-0.20.2/package/dist/xlsx.full.min.js"></script> - 从
table.cache['yourTableId']拿原始数据,对目标字段做转换:item.applytime = new Date(item.applytime * 1000) - 用
XLSX.utils.json_to_sheet()或aoa_to_sheet()构造 sheet,确保日期列值是Date类型(不是字符串) - 批量设格式需遍历单元格:
ws['A2'].z = 'yyyy-mm-dd'; ws['B2'].z = 'yyyy-mm-dd hh:mm:ss';单个设完后记得循环到最后一行
CSV 导出根本没法设日期格式
别在 CSV 上浪费时间调格式——CSV 是纯文本,没有「单元格格式」概念。Excel 打开 CSV 时靠启发式猜测类型,你加引号、换分隔符都只是影响它的猜测概率,无法强制锁定。
- 如果坚持用
table.exportFile(..., 'csv'),唯一能做的就是统一输出格式为YYYY/MM/DD,避免DD/MM/YYYY在英文系统下被误判 - 字段值本身带双引号(如
"2024/04/05")可能让 Excel 更倾向当文本,但不保证,尤其含时间部分时 - 导出后右键单元格 →「设置单元格格式」→「日期」?那是用户手动操作,不属于前端可控范围
后端导出才是生产环境的稳定解法
表格启用了服务端分页、权限过滤,或者需要所有日期统一为「2024年04月05日」这种中文格式,前端拼接就不可靠。此时导出逻辑应完全移交后端。
- 前端只传参:
export_type=selected&ids=1,2,3&date_format=yyyy年MM月dd日 - 后端用
openpyxl(Python)或Apache POI(Java)生成真实.xlsx,精确设置每列数据类型(CELL_TYPE_DATE)和格式代码(14对应yyyy-mm-dd) - 注意:前端调
location.href或fetch().then(res => res.blob())触发下载即可,不要试图在浏览器里“模拟 Excel”
真正难的不是怎么写格式化代码,而是决定在哪一层做这件事——前端手动构造 xlsx 容易卡顿,后端导出要协调接口和权限,选错一层,后续全是补丁。











