layui table 默认打印只打当前页,因其直接打印可视区域的 .layui-table-body;打印全部数据需用 AJAX 获取全量数据、手动拼接完整 HTML 表格、注入打印样式并调用 window.print()。
layui table 自带打印按钮为什么只打当前页
因为 layui table 的默认打印逻辑是直接抓取当前 dom 中渲染出的 .layui-table-body 区域,它不关心分页数据是否完整,也不触发重新请求。你点工具栏的「打印」,本质就是对可视区域做 window.print(),所以翻页后打印、或想打全部数据时必然漏掉其他页。
如何打印全部数据(非当前页)
必须绕过默认行为,自己构造完整表格 DOM —— 核心是:用 AJAX 拉全量数据 + 手动拼 HTML 表格结构 + 套打印样式 + 调用 window.print()。
- 先定义好列配置(
cols),和渲染表格时一致,但要过滤掉toolbar、checkbox这类不可导出字段 - 用
$.ajax或fetch请求完整数据(注意带上分页参数如page=1&limit=99999,或后端提供「不分页全量接口」) - 拼
<table> <thead>...</thead> <tbody>...</tbody> </table>,字段映射用v[field],别硬写v.id - 创建临时
div容器,把拼好的 HTML append 进去,再用window.open新开窗口写入内容 - 新窗口中务必内联
@media print样式,否则浏览器会套默认样式,表头错位、边框消失很常见
打印样式里最容易被忽略的三个点
纯靠 window.print() 不加控制,90% 的打印效果会翻车:
-
tr { page-break-inside: avoid; }—— 否则表格行可能被截断到两页中间 -
thead { display: table-header-group; }—— 确保每页顶部都显示表头(部分浏览器需要这个) - 所有非打印元素(如按钮、搜索框、分页栏)必须加
class="no-print"并在@media print里设display: none
导出 CSV 和打印能共用同一份数据处理逻辑吗
可以,而且推荐这么做。导出 exportFile(id, data, 'csv') 的 data 参数和你手动拼打印表格用的 res 数据源,应来自同一个清洗后的数组 —— 比如统一做字段映射、空值转「-」、时间格式化、金额加千分位等。否则导出的 CSV 里是「2026-04-01」,打印出来却是「Wed Apr 01 2026」,用户会困惑。
真正复杂的是列动态控制:打印时你可能隐藏操作列,导出时却要保留 ID 供 Excel 关联;这种差异建议抽成一个函数,输入 cols 和 row,输出干净的字段值数组,而不是到处写 v[field] || '-' 。











