导出时跳过templet列需手动过滤:因table.exportFile()只认field字段名,不识别templet,故必须在自定义导出逻辑中显式排除含templet的列(如field为'opt'或'action'),并确保使用table.getData()导出全部数据而非仅当前页cache。
导出时跳过 templet 列必须手动过滤 table.cache
layui 的 table.exportfile() 不识别 templet 是否存在,它只认 field 字段名。只要列配置里有 field(比如 field: 'opt'),且该字段在 table.cache 中有对应 key,就会被导出——哪怕你用 templet 渲染的是按钮、徽章或空字符串。
常见错误现象:列设置了 templet: function(d) { return '编辑'; },导出 Excel 却多出一列“编辑”文字;或者列没设 field,但导出后出现 LAY_TABLE_INDEX 这类奇怪字段。
- 确认操作列是否带
field:打开控制台,执行layui.table.config.cols['your-table-id'][0],逐个检查目标列的field值(如'action'、'opt'或undefined) - 若
field存在(非null/''),必须在构造导出数据时显式跳过该 key - 若
field为undefined或空字符串,该列通常不会出现在table.cache中,无需额外处理 - 不要依赖
hide: true、unresize: true或 CSSdisplay: none,这些对导出完全无效
templet 列没设 field 时也可能意外导出
某些旧版 Layui(如 2.4.5)在导出逻辑中会把未定义 field 的列强行补上默认 key(如 LAY_TABLE_INDEX),导致导出 CSV 里冒出无意义列。这不是渲染问题,是源码级行为。
实操建议:
- 升级到 Layui 2.8+ 可规避此问题(官方已修复导出时对无
field列的误处理) - 若无法升级,可在导出前检查
table.cache每行对象的 keys:Object.keys(cacheData[0]),比对cols定义,把多余 key(如'LAY_TABLE_INDEX')从清洗逻辑中剔除 - 对
templet列强制设field: null或留空字符串,并在过滤时统一排除:if (!col.field || col.field === 'opt') continue;
绕过默认导出按钮,改用自定义导出逻辑
直接点击 toolbar 默认导出图标(defaultToolbar)会忽略你的过滤逻辑,因为它内部调用的是无参数的 exportFile('id'),自动读取全量 table.cache。
正确做法是绑定自定义工具栏事件:
table.on('toolbar(test)', function(obj){
if(obj.event === 'export'){
var cacheData = layui.table.cache['test'];
var cols = layui.table.config.cols['test'][0];
var exportData = cacheData.map(function(row) {
var cleaned = {};
cols.forEach(function(col) {
// 跳过 templet 列:明确排除已知 field,或过滤掉无 field 的列
if (!col.field || col.field === 'opt' || col.field === 'action') return;
cleaned[col.field] = row[col.field];
});
return cleaned;
});
layui.table.exportFile('test', exportData, 'csv');
}
});
- 务必确保
layui.use(['table'])已加载,否则layui.table为undefined - 第三个参数
'csv'必须显式传入,否则可能触发默认全量导出路径 - 如果表格启用了分页(
page: true),table.cache只含当前页数据;要导出全部,需改用table.getData('test')(Layui 2.7+)或重新请求接口
templet 渲染 Badge/按钮时导出为空?检查源码兼容性
在 Layui 2.4.5 等老版本中,templet 列的数据导出为空,是因为导出逻辑里有一行硬编码:o.push('"'+y.call(l,n,r,a,"text")+'"'),它会跳过所有 templet 函数返回值,只取原始字段值。
临时修复方案(仅限无法升级场景):
- 定位
layui.js或lay/modules/table.js中导出函数内该行代码 - 替换为:
!!n.templet ? o.push(r) : o.push('"'+y.call(l,n,r,a,"text")+'"') - 这样当列配置了
templet,就直接使用cache中已渲染好的值(即r),避免取空
这个改动极小,但影响导出行为的本质——它让 templet 列的导出结果和你在页面上看到的一致,而不是强行回退到原始字段。











