table.checkStatus()仅返回当前页勾选项,非全量数据;导出前需手动按列顺序构造二维数组,校验空数据并提示,确保checkbox配置正确且状态同步。
table.checkStatus() 只返回当前页勾选项,这是前提
很多人误以为 table.checkstatus('id').data 会包含跨页选中的所有行,其实它只取当前页渲染范围内被勾选的原始数据。如果你表格开了分页(page: true),且用户在第 1 页勾了 2 行、第 3 页勾了 1 行,调这个方法只会拿到第 1 页那 2 行——除非你当前正处在第 3 页。这个行为是设计使然,不是 bug。
所以「导出当前页已选中的行」这件事,天然就和 checkStatus() 匹配,不需要额外过滤或跨页合并。
- 确保表格初始化时写了
id: 'yourTableId',否则table.checkStatus('yourTableId')返回空对象 - 必须在表格完成首次加载后调用,比如放在
done回调里,或工具栏按钮的 click 事件中(此时 DOM 已稳定) - 如果表格还没渲染完就调,
data是空数组,导出结果只有表头
导出前必须手动构造字段顺序对齐的二维数组
table.exportFile() 不接受对象数组,它内部按列定义顺序(cols[0].field、cols[1].field…)逐字段取值。直接传 checkStatus().data 会静默失败,Excel 或 CSV 里可能全空或错列。
正确做法是先提取表头,再把每行数据按相同顺序 map 成一维数组:
const status = table.checkStatus('userTable');
const selectedData = status.data;
if (!selectedData.length) return;
// 拿 cols 定义(注意:是 table.config.xxx.cols[0],不是 cols[0] 直接访问)
const cols = table.config.userTable.cols[0];
const headers = cols.map(col => col.title || col.field);
const rows = selectedData.map(row =>
cols.map(col => {
// 处理 templet 渲染字段:比如 status: 1 → "启用"
if (col.templet) {
return typeof col.templet === 'function'
? col.templet(row)
: row[col.field];
}
return row[col.field];
})
);
table.exportFile(headers, [headers, ...rows], 'csv');
-
headers和每行row的字段顺序必须严格一致,否则 CSV 列错位 - 如果某列用了
templet渲染(如状态转文字、链接拼接),selectedData里仍是原始值(如status: 1),需手动映射 -
exportFile()第二个参数必须是二维数组,第一行是表头,后面是数据行
别漏掉空数据校验和用户提示
空数组传给 exportFile() 不报错,但会生成一个只有表头的 CSV 文件,用户点开发现“什么都没导出来”,容易以为功能坏了。
- 必须显式判断
selectedData.length === 0,并用layer.msg()提示 - 不要依赖
exportFile()自带的失败反馈——它不处理空数据场景 - 如果表格没开
checkbox: true,checkStatus().data永远是空数组,得提前检查列配置
toolbar 事件里绑定导出时,避免作用域污染
在 table.on('toolbar(filter)', ...) 里写导出逻辑最稳妥,因为能确保表格实例已就绪;但如果在外面用 jQuery 绑 click,容易因变量名冲突或执行时机不对,误把全量数据塞进去。
- 错误写法:
table.exportFile('userTable', window.allData)—— 即使按钮叫“导出当前页选中”,也可能导出全部 - 正确写法:只从
table.checkStatus()拿数据,不引用任何全局变量 - 如果用了
page: false(前端分页),checkStatus().data就是当前页过滤后的勾选项,仍适用同一套逻辑
checkStatus() 能真实反映 UI 状态——这要求 checkbox 列配置正确、事件监听没被覆盖、表格没在重载后丢失状态。稍有疏忽,用户点完勾选再点导出,拿到的还是旧数据。











