layui table.exportfile() 导出的 excel 不带打印设置,因此无顶端标题行;需手动在「页面布局→打印标题」中设为 $1:$1,或用 sheetjs 0.19+ 设置 ws['!print']{titlerows:'1:1'}。
layui 的 table.exportfile() 导出的是纯数据 excel(.xlsx),不带任何打印设置——它生成的文件里 没有“顶端标题行”配置,excel 打开后默认不会每页重复表头。这是导出功能本身的限制,不是你漏设了某个参数。
为什么导出的 Excel 打印时只有第一页有标题?
table.exportFile() 底层调用的是 SheetJS(xlsx 库),只写入单元格数据和基础样式,完全不写入 Excel 的页面设置(Page Setup)信息,包括:
-
PrintTitleRows(顶端标题行) PrintArea- 分页符、缩放、页眉页脚等
所以即使你在 Layui 表格里设置了 cols 表头,导出后的 Excel 文件在「页面布局 → 打印标题」里是空的,必须手动补设。
导出后手动设置顶端标题行的正确操作
这是目前最可靠、零依赖的方式,适用于所有 Layui 版本(包括 2.9.x 和 layui-vue):
- 打开导出的 Excel 文件
- 切换到「页面布局」选项卡
- 点击「打印标题」→ 弹出「页面设置」对话框 → 切到「工作表」标签页
- 在「顶端标题行」输入框中填入:
$1:$1(单行表头)或$1:$2(两行表头) - 点击「确定」
✅ 注意:必须用
$开头的绝对引用(如$1:$1),不能写成1:1或A1:Z1;否则 Excel 无法识别为“重复标题行”。
能否在导出时自动写入打印标题设置?
不能直接通过 Layui 实现,但可绕过:
-
方案一(推荐):用 SheetJS + custom workbook 写入 PageSetup
在调用
table.exportFile()前,先用xlsx库手动构造 workbook,并设置ws['!print']属性:const ws = XLSX.utils.aoa_to_sheet([['姓名', '年龄'], ['张三', 25]]); ws['!print'] = { titleRows: '1:1' // ← 关键:告诉 Excel 第1行作为顶端标题行 }; XLSX.writeFile(workbook, 'data.xlsx');⚠️ 风险:Layui 2.x 默认打包的 xlsx 版本较老(v0.18.x),不支持
!print;需自行升级到 v0.19+ 并替换layui/lay/modules/table.js中的 xlsx 引用,且该设置在部分 Excel 版本(尤其是 Mac 或 WPS)中可能被忽略。 -
方案二:导出后用 Excel 宏或 Python 自动补设
若批量导出,可用 Python +
openpyxl后处理:from openpyxl import load_workbook wb = load_workbook("data.xlsx") ws = wb.active ws.print_title_rows = '1:1' # ← 这会写入真正的 PageSetup wb.save("data_fixed.xlsx")这种方式稳定生效,但需要额外运行脚本。
容易被忽略的关键点
- 导出的 Excel 文件是否启用「自动筛选」或存在「隐藏行」?这些会干扰分页预览对标题行的识别,导致设置后仍不显示;
- WPS 表格对
PrintTitleRows支持不完整,建议用 Microsoft Excel 核验效果; - 如果表格列数超宽(比如 30+ 列),Excel 可能自动分页在中间截断,此时仅靠
$1:$1不够,还需配合「分页预览」拖动水平分页符,让标题行完整落在每页顶部虚线框内。
你真正要做的,不是在 Layui 里找一个不存在的配置项,而是接受「导出即裸数据」的事实,把打印标题当作 Excel 后处理环节来对待。











