layui导出excel必须显式控制列顺序、标题和值映射,exportfile()仅依据cols中的title生成表头、不解析templet,需手动处理隐藏列、虚拟列、csv转义及日期/数字格式转换。
不能靠改后端字段名或前端 field,必须显式控制导出时的列顺序、标题、值映射——layui 的 exportfile() 只认 cols 配置里的 title 和数据数组的字段结构,不解析模板(templet)或隐藏列逻辑。
导出字段和表头名称不一致?改 cols 里的 title 就行
很多人以为要改后端返回的 key 名,或者写额外映射函数,其实完全没必要。Layui 导出时直接读取列配置中 title 字段作为 Excel 表头,和 field 值无关。
-
title是唯一决定 Excel 第一行文字的内容,哪怕field: "user_name",只要title: "姓名",导出就是“姓名” - 动态生成
cols时,确保每个对象都带title,漏掉会导致该列表头为空 - 如果某列用了
templet渲染(比如状态转“启用/禁用”),exportFile()不会自动执行它——你得在导出前手动把原始值转成展示值,再塞进数据数组
想导出隐藏列或调整字段顺序?临时重写 cols 和 data
Layui 默认只导出 hide: false 的列,且顺序严格按 cols 数组顺序。要突破这个限制,就得绕过默认行为,自己构造参数传给 exportFile()。
- 导出隐藏列:复制原始
cols,把目标列的hide改为false,再传入;不要直接改原始配置,避免影响表格渲染 - 调整顺序:重新排列
cols数组,比如把["id", "name", "status"]换成["name", "status", "id"],然后用table.exportFile('id', data, { cols: newCols }) - 新增虚拟列(如“操作人”、“导出时间”):在
data数组里每项手动加字段,同时在cols里补一条{ field: 'exportTime', title: '导出时间' }
导出 CSV 时字段含逗号、换行、引号?必须手动转义
CSV 是纯文本格式,字段里如果有 ,、
、",不处理就会错位。Layui exportFile() 不做自动转义,得你自己预处理。
- 对每个字符串字段调用:
value.replace(/"/g, '""').replace(/ /g, '\n'),再整体用双引号包裹 - 整行拼接前,确保每列都经过上述处理,否则 Excel 打开后列数错乱
- 中文字段建议开头加
uFEFF(BOM 头),否则 Windows 上 Excel 可能识别为 GBK 编码导致乱码
需要保留数字格式(如金额两位小数)、日期类型?别依赖原始数据类型
导出到 Excel 时,数字被当文本处理(比如 "12345.67"),Excel 会显示为左对齐、无法求和;时间戳(1713456000000)也不会自动转成日期。
- 金额类字段:导出前用
parseFloat(val).toFixed(2)转成字符串,或用toLocaleString()加千分位 - 日期字段:必须转成 JS
Date对象(如new Date(timestamp)),SheetJS 才能识别并写入 Excel 的日期类型 - 如果最终走的是
exportFile(..., { type: 'xlsx' }),注意这只是“伪 xlsx”——实际仍是 CSV 冒充,所有类型控制都失效;真要格式,必须用xlsx.full.min.js手动构造 workbook
最易被忽略的一点:字段映射不是一次性配置,而是每次导出都要重新检查。特别是用了 templet、服务端分页、动态列的场景,table.cache 返回的数据结构可能和渲染结果不一致,不手动校验字段存在性和类型,导出内容就容易缺项或错位。











