Layui table.exportFile() 不支持 Excel 列只读,因其导出的是 CSV 文本而非真实 .xlsx 文件;CSV 无单元格锁定机制,所有列天然可编辑;需改用 SheetJS 生成带 protection 的 .xlsx 或导出时过滤敏感字段。
layui 的 table.exportfile() 根本不支持设置 excel 列为只读——这不是配置遗漏或版本问题,而是设计上就不存在这个能力。
为什么 exportFile 导出的文件所有列都能编辑
Layui 导出本质是生成 CSV 文本,不是真正的 Excel(.xlsx)文件。CSV 是纯文本格式,没有单元格锁定、工作表保护等概念。你用 Excel 打开它,只是 Excel 在“兼容模式”下自动解析逗号分隔内容,所有字段天然可编辑。
-
exportFile不解析样式、不写入二进制结构、不调用 Office API - 在
cols里加readonly: true、edit: false或export: false全部无效——这些只影响前端表格双击编辑行为,对导出零作用 - 浏览器下载的 CSV 文件,Excel 默认用 GBK 解码(尤其 Windows),中文还容易变问号,更别说权限控制了
想让某列在 Excel 里真正不可编辑,必须换方案
真实 Excel 的“只读列”依赖两个前提:工作表启用保护 + 目标单元格设为 locked: true。而 Layui 原生导出连 .xlsx 都不生成,这条路走不通。
- 得弃用
table.exportFile(),改用xlsx(SheetJS)库生成真实.xlsx - 用
XLSX.utils.json_to_sheet()构造数据后,手动遍历目标列单元格,设置cell.s = { protection: { locked: true } } - 关键一步不能漏:
ws['!protect'] = { sheet: true },否则locked状态完全不生效 - 注意:默认所有单元格都是
locked: true,所以实际要做的反而是把非目标列显式设为locked: false
导出前过滤字段比“Excel 只读”更务实
多数业务说的“只读列”,真实意图是“不让用户改敏感字段”,比如 user_id、create_time。与其折腾 Excel 保护逻辑,不如导出时直接剔除这些字段。
- 用
table.cache['your-id']拿当前页数据,或table.getData('your-id')拿全量(Layui 2.7+) - 对每行做对象解构,只保留需要导出的 key:
data.map(({ username, status }) => ({ username, status })) - 调用
layui.table.exportFile('标题', filteredData, 'csv'),第三个参数'csv'必须显式传,否则可能触发默认全量导出 - 如果要解决中文乱码,绕过
exportFile,自己拼 CSV 字符串并在开头加'\ufeff'(UTF-8 BOM)
真正难的不是加个 locked,而是意识到:CSV 不是 Excel,前端无法安全实现带密码的 Excel 保护——那部分逻辑一旦暴露在 JS 里,密码就等于没设。


















