layui table数据导出excel layui表格如何导出数据

秋涛姑娘_5171

秋涛姑娘_5171

2026-03-20

800人浏览

原创

Layui Table 默认不支持真正 Excel(.xlsx)导出,table.exportFile() 仅导出 CSV 文本,易出现乱码、无样式、科学计数法等问题;需用 SheetJS 前端生成真实 .xlsx,或交由后端流式导出全量数据。

layui table 默认不支持 Excel 导出,得自己加逻辑

layui 的 table 组件本身没有内置导出 excel 功能,所谓“导出 excel”实际是前端生成 .xlsx 文件或后端吐出文件流。直接调用 table.exportfile() 只能导出 csv(纯文本),不是真正的 excel(.xlsx),双击打开可能乱码、无样式、不识别日期/数字格式。

常见错误现象:table.exportFile() 导出的文件后缀是 .xls 或 .xlsx,但用 Excel 打开提示“文件格式和扩展名不匹配”,点“是”才能勉强看——本质还是 CSV 冒充 Excel。

  • 如果你只需要简单表格、兼容性要求低,用 table.exportFile() + type: 'csv' 最省事
  • 如果要带样式、合并单元格、正确识别数字/日期,必须用 xlsx 库(如 SheetJS)在前端生成真实 .xlsx
  • 如果数据量大(>5000 行)、含服务端计算字段或权限过滤,导出逻辑应放在后端,前端只触发下载

用 SheetJS(xlsx)在前端生成真实 Excel 文件

SheetJS 是目前最稳定的前端 Excel 生成方案,layui 表格数据可直接转成二维数组喂给它。注意:不能直接传 table.cache 原始对象,要先做字段映射和清洗。

使用场景:中小数据量(≤1w 行)、字段结构固定、无需服务端加工。

实操建议:

  • 引入 https://cdn.sheetjs.com/xlsx-0.20.2/package/dist/xlsx.full.min.js(务必用 full 版,支持写入样式)
  • 从 table.config.cols 提取表头文字,用 table.cache[tableName] 拿当前页或全量数据(注意分页影响)
  • 日期字段需手动转为 JS Date 对象,否则导出是时间戳;数字字符串(如 "123.00")要 parseFloat() 否则 Excel 当文本处理
  • 调用 XLSX.utils.aoa_to_sheet() 传入 [headers, ...rows],再用 XLSX.writeFile() 触发下载

简短示例:

const data = table.cache['myTable'] || [];
const headers = ['姓名', '邮箱', '入职时间', '薪资'];
const rows = data.map(item => [
  item.name,
  item.email,
  new Date(item.joinDate), // 确保是 Date 类型
  parseFloat(item.salary)
]);
const ws = XLSX.utils.aoa_to_sheet([headers, ...rows]);
XLSX.writeFile(ws, '员工列表.xlsx');

后端导出:避免前端卡死和数据不一致

当表格启用了服务端分页、搜索、权限字段脱敏,或单次导出超 1w 行时,前端拼数据既不可靠又容易崩溃。此时必须走后端接口,且不能复用前端请求参数(比如把 page=1&limit=10 直接拿去查库导出)。

容易踩的坑:

  • 没加 export=1 类似标识,导致后端按分页逻辑只返回第一页数据
  • 前端传了 where 搜索条件,但后端没透传或 JSON 解析失败,导出空数据
  • 响应头没设 Content-Disposition: attachment; filename="xxx.xlsx",浏览器直接渲染二进制内容,显示乱码
  • 后端用 POI 或 EPPlus 生成 Excel,但未设置单元格类型(如把手机号当数字存,导出后变成 1.38E+10)

推荐做法:前端用 location.href 或 fetch + response.blob() 触发下载,URL 携带完整筛选参数,后端忽略分页,查全量并流式写入。

导出按钮放哪?怎么控制权限和状态

别直接塞在 toolbar 里用 lay-event 绑定——用户点了没反应、报错、重复点击,都没反馈。导出是重操作,必须有显式状态控制。

实操建议:

  • 按钮用独立 DOM(如 <button id="exportBtn"></button>),禁用状态通过 addClass('layui-btn-disabled') + attr('disabled', true) 双保险
  • 点击后立即置灰按钮,防止重复提交;成功后恢复,失败后弹 layer.msg() 并保留禁用态 2 秒
  • 权限判断不要只靠前端隐藏按钮,后端接口仍需校验 role 或 permission 字段,否则绕过按钮也能调用接口
  • 如果导出耗时 >3s,加 loading 提示(layer.load(2)),别让用户以为卡死了

真正麻烦的从来不是“怎么导出”,而是“导什么”“谁能让它导”“导错了谁负责”。字段映射漏一列、时间格式少转一次、权限多放行一个接口,线上就可能出问题。

WPS零基础入门到精通全套教程!
WPS零基础入门到精通全套教程!

全网最新最细最实用WPS零基础入门到精通全套教程!带你真正掌握WPS办公! 内含Excel基础操作、函数设计、数据透视表等

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2483

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

5343

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6390

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

5978

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

843

5

C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

3169

3

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

2023.07.25

2308

9

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

2023.08.02

1240

5

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.09

1198

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.7万人学习