table.exportFile() 不支持任何单元格格式设置,仅导出无样式的 CSV 文件;需用 SheetJS 或服务端生成带格式的 Excel。
layui table.exportFile() 不支持单元格格式设置
直接说结论:table.exportfile() 是 layui 内置的简易导出,底层用的是纯前端 csv 生成逻辑,**不走 excel 格式(.xlsx),也不支持字体、边框、合并单元格、数字格式等任何单元格样式**。它导出的是纯文本 csv 文件,excel 打开时靠自动识别渲染,无法控制列宽、颜色、千分位、日期格式等。
常见错误现象:
• 导出的数字(如 1234567890)在 Excel 里显示为科学计数法
• 以 0 开头的字符串(如 "00123")被转成 123
• 日期字段变成一串数字(如 1712345678000)
• 中文表头或内容出现乱码(尤其是 Windows 系统默认 Excel)
想设格式必须换方案:用 SheetJS(xlsx.js)手动构造工作表
Layui 本身不提供 Excel 样式能力,但可以拦截导出动作,用 XLSX.write() 替代原生逻辑。核心思路是:不调 table.exportFile(),而是用 table.getData() 拿数据,再用 SheetJS 构建带样式的 .xlsx 文件。
- 必须引入
xlsx.full.min.js(注意不是轻量版,要带样式支持) - 中文需设
cellStyles: true+ 手动指定workbook.Props字符集(否则 Excel 可能报“文件损坏”) - 单元格格式靠
cell.z = "格式代码"控制,比如:"0.00"(保留两位小数)、"yyyy-mm-dd"(日期)、"@"(强制文本) - 列宽、字体、背景色等需通过
cell.s(style 对象)设置,但要注意:Layui 表格列配置里的field和title需映射到 sheet 的列索引
示例关键片段:
const data = table.getData('your-table-id');
const ws = XLSX.utils.json_to_sheet(data, {
header: ['id', 'name', 'amount', 'create_time'], // 显式指定列顺序
});
// 强制 amount 列为数值并保留两位小数
for (let R = 1; R <= data.length; R++) {
const cell = ws[XLSX.utils.encode_cell({r: R, c: 2})]; // 第3列(amount)
if (cell) {
cell.z = '0.00';
}
}
// 设置首行为粗体 + 背景色
ws['!cols'] = [{ wpx: 80 }, { wpx: 120 }, { wpx: 100 }, { wpx: 140 }];
XLSX.writeFile(XLSX.utils.book_new(), '报表.xlsx');
导出带格式 Excel 的兼容性与性能代价
用 SheetJS 实现格式控制,会明显增加前端负担,尤其数据量大时:
- 1 万行 × 10 列以上,Chrome 下生成耗时可能超 2 秒,用户感知卡顿
- IE11 不支持
Blob下载,需降级用Downloadify或服务端兜底 - 移动端 Safari 对大文件
writeFile支持不稳定,常静默失败 - 所有样式设置(如颜色值)必须用 RGB 十六进制格式(
"#FF5733"),不能用名称("red")或 rgba
如果只是解决数字/日期显示问题,更轻量的做法是:导出前对数据做预处理——比如把数字转成字符串加制表符前缀 "\t" + num.toFixed(2),骗 Excel 当文本读;日期转成 yyyy-mm-dd 字符串。但这属于“绕过格式”,不是真设单元格格式。
服务端导出才是生产环境推荐路径
真正需要稳定、可控、带样式的 Excel 导出,应该把数据发给后端,由服务端生成 .xlsx 并返回二进制流。原因很实际:
- 避免前端内存爆炸(SheetJS 加载 5 万行数据容易触发 Chrome OOM)
- 服务端可复用模板(如用
Apache POI或python-openpyxl套用已有 Excel 样式) - 统一处理权限、审计日志、导出限流
- 规避前端时间戳时区问题(比如 JS 的
Date对象在不同机器上解析"2024-03-01"可能差一天)
Layui 前端只需发个 fetch('/api/export?table=order'),后端返回 Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,浏览器自动下载。这时候“单元格格式”完全由后端控制,和 Layui 无关。
真正难的不是怎么写 JS,而是想清楚:你导出的 Excel 是给人看的报表,还是给系统对接用的数据?前者要样式、要打印适配、要兼容老版本 Excel;后者只要字段对得上、编码不乱、数字不丢精度。别在前端硬扛不该它扛的事。


















