导出全部数据必须通过后端提供全量接口(如加export=all参数),前端调用table.exportFile()传入该数据;不能依赖table.cache、getAllData()或getData(),因它们在服务端分页下仅含当前页数据。

table.exportFile() 传全量 data 才能导出全部
默认点击工具栏导出按钮,只导出当前页 table.cache 里的数据 —— 这不是 bug,是设计如此。想导出全部,必须绕过默认逻辑,手动调用 table.exportFile(id, data, type) 并传入完整数据数组。
关键点:data 必须是你自己拿到的全量数据,不能依赖 table.getAllData() 或 table.getData()(它们在服务端分页下基本为空)。
- 后端一次性返回全部数据 → 前端用
data: []初始化表格(page: false),再调用table.exportFile('id', table.getData(), 'csv') - 后端只支持分页接口 → 需额外发一次请求,带
export=all参数,获取全量 JSON,再传给exportFile - 别把
table.cache['yourTableId']当全量用:它只存当前页渲染过的行,翻页后旧页数据就被丢弃了
后端加 export=all 参数是最稳的方案
前端不拼大数据、不等渲染、不操心内存,让后端查一次全量、吐一次流,浏览器直接下载。这是生产环境最推荐的做法。
示例事件绑定:
layui.table.on('toolbar(userTable)', function(obj){
if(obj.event === 'exportAll'){
const url = '/api/user/list?export=all&token=' + encodeURIComponent(layui.data('user').token);
window.location.href = url;
}
});
- 必须用
window.location.href触发 GET 下载,fetch或axios拿不到文件流 -
export=all是自定义参数,后端需识别并跳过分页逻辑(如忽略page/limit) - 记得补全认证字段(
token、csrf_token),否则 401/403 - URL 中含中文或特殊字符时,务必用
encodeURIComponent()包一层
templet 列导出时多出无意义字段?得手动过滤
table.exportFile() 不管你有没有写 templet,只要列配置里有 field(比如 field: 'opt'),就会从 table.cache 里取这个 key 导出 —— 即使你渲染的是按钮或空格。
- 检查列定义:
console.log(layui.table.config.cols['yourTableId']),确认哪些列的field是操作类(如'action'、'opt') - 导出前清洗数据:遍历每行对象,
delete row.opt或用Object.keys(row).filter(k => !['opt', 'LAY_TABLE_INDEX'].includes(k)) - 不要设
hide: true或 CSS 隐藏,对导出完全无效 - 升级到 Layui 2.8+ 可避免
LAY_TABLE_INDEX被误导出(旧版会自动补)
导出 .xlsx 而不是 .csv?别信后缀名
table.exportFile() 无论 type 设成 'xls' 还是 'xlsx',实际都生成 CSV 文本。Excel 双击打开提示“格式不匹配”,点“是”才能看,本质还是逗号分隔。
- 要真 Excel(带样式、日期识别、数字不转科学计数法)→ 引入
xlsx.full.min.js,用XLSX.utils.aoa_to_sheet()构造二维数组 - 日期字段导出前转
new Date(),数字字符串转parseFloat(),否则 Excel 当文本处理 - 数据量大(>5000 行)或含权限字段 → 放后端导出更可靠,前端只负责触发下载链接
table.getAllData() 上浪费时间,先确认后端是否支持不分页接口,或者能否加 export=all 参数。其他都是修修补补。


















