layui table.exportfile() 不支持字体颜色等样式设置,需引入 xlsx.full.min.js 手动构建带样式的 xlsx 文件,仅建议对表头或关键列设样式以避免性能问题。

layui table.exportFile() 导出的 Excel 无法直接设置字体大小和颜色
Layui 原生 table.exportFile() 方法底层调用的是 SheetJS(xlsx.js),它只做纯数据导出,不支持样式控制。你看到的 Excel 字体、颜色、边框等,全是 Excel 默认渲染效果,exportFile() 的参数里根本没有 font、color 或 style 这类字段——传了也无效。
想改字体/颜色,必须绕过 exportFile(),手动生成带样式的 XLSX 文件
核心思路是:用 table.cache 拿到表格数据 → 用 SheetJS 手动创建 workbook/worksheet → 通过 cell.s(即 cell style)写入字体、颜色等样式 → 调用 XLSX.writeFile() 触发下载。关键依赖是完整版 xlsx.full.min.js(不是 layui 自带的精简版)。
常见踩坑点:
- layui 自带的
xlsx.min.js不含样式支持,必须额外引入xlsx.full.min.js - 样式对象必须挂载到单元格的
s属性上,且需在ws[cellRef]上显式赋值,不能靠遍历后统一设 - 字体颜色用十六进制字符串(如
"FF0000"),不是 CSS 的#ff0000 - 中文 Excel 打开时若乱码,通常是因为没设
!cols宽度或未启用cellNF: true
一个最小可运行的样式导出示例
// 确保已引入 xlsx.full.min.js(非 layui 自带那个)
const data = layui.table.cache['your-table-id'] || [];
const ws = XLSX.utils.aoa_to_sheet([
['姓名', '年龄', '城市'], // 表头
...data.map(row => [row.name, row.age, row.city])
]);
// 设置表头行样式(第 1 行,索引 0)
const headerCells = ['A1', 'B1', 'C1'];
headerCells.forEach(cellRef => {
if (ws[cellRef]) {
ws[cellRef].s = {
font: { bold: true, sz: 14, color: { rgb: "FFFFFF" } },
fill: { fgColor: { rgb: "4472C4" } },
alignment: { horizontal: "center" }
};
}
});
// 设置整列宽度(防中文被截断)
ws['!cols'] = [{ wpx: 120 }, { wpx: 80 }, { wpx: 120 }];
const wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, ws, '用户列表');
XLSX.writeFile(wb, '用户列表.xlsx');
导出大量数据时字体/颜色会明显变慢,别盲目套样式
SheetJS 对每个单元格单独设 s 属性是 O(n) 操作,万级数据+全量样式可能卡顿甚至内存溢出。真实项目中建议:
- 仅对表头、关键列(如状态列)加样式,正文保持默认
- 避免在循环里重复 new 样式对象,提前定义复用
- 若需复杂样式(合并单元格、条件色阶),直接用服务端导出(如 Java EasyExcel / Python openpyxl)更稳妥
浏览器端 Excel 样式本质是“妥协方案”,真要精细控制,别在前端硬刚。











