layui exportExcel 不读取 hide 等 UI 属性,需显式通过 cols 参数指定导出列;多级表头须展平,field 必须与数据源严格一致;reload 后列变更需手动维护 currentExportCols。
layui table exportExcel 时 column 隐藏不生效
导出 excel 时列没隐藏,是因为 exportexcel 不读取表格渲染时的 hide 或 unresize 等 ui 属性,它只认你传给它的原始数据结构。你得显式告诉它哪些列不导出。
- 必须在调用
table.exportExcel时,通过cols参数重新指定要导出的列数组,不能依赖表格初始化时的cols配置 -
cols数组里每个对象需包含field和title,且field必须和数据源字段完全一致(包括大小写) - 如果用了多级表头(
children),cols必须展平为一维,且只保留叶子节点
如何构造 exportExcel 的 cols 参数跳过特定列
核心是「过滤掉不想导出的列」,不是“隐藏”,而是“不传进去”。比如你想隐藏 id 和 status 列:
const exportCols = table.config.myTable.cols[0].filter(col =>
!['id', 'status'].includes(col.field)
);
table.exportExcel({
data: table.cache.myTable,
cols: [exportCols], // 注意:必须包一层数组
filename: '用户列表.xlsx'
});
-
table.config.myTable中的cols是初始化时的完整列配置,可直接读取 - 如果表格启用了多级表头,
cols[0]是第一行表头;若只有单层,则cols[0]就是全部列 -
data推荐用table.cache.xxx,避免导出时数据与界面不同步
导出时字段名/标题中文乱码或格式错乱
这是 Excel 导出库(SheetJS)对中文支持弱导致的,默认生成的 .xlsx 文件编码没问题,但 Windows 自带 Excel 有时会误判为 ANSI。解决方式很直接:
- 导出后手动用 WPS 或 Excel 打开 →「数据」→「从文本导入」→ 编码选
UTF-8,就能正常显示 - 不想让用户手动操作?改用
type: 'csv'并加 BOM 头(但 CSV 不支持样式和多类型单元格) - 不要试图在
title字段里加 \t、\n 或 HTML 标签,exportExcel会原样写入单元格,Excel 不解析
动态列场景下 exportExcel 拿不到最新 cols
如果你用 table.reload 后修改了列(比如 show/hide 列按钮),table.config.xxx.cols 不会自动更新——它只保存初始化时的快照。
- 每次列变更后,自己维护一个
currentExportCols数组,并在导出时用它 - 监听
table.on('toolbar(filter)')或自定义按钮事件,在里面重新生成cols过滤逻辑 - 别依赖
table.getOptions('xxx').cols,这个 API 在较老版本 Layui 中不存在或返回不全











