手摸手教你前端和后端是如何实现导出 Excel 的?
前言
大家好呀,我是雪荷。在上篇文章(https://blog.hejiajun.icu/2024/07/26/EasyExcel-%E5%88%9D%E4%BD%BF%E7%94%A8%E2%80%94%E2%80%94-Java-%E5%AE%9E%E7%8E%B0%E5%A4%9A%E7%A7%8D%E5%86%99%E5%85%A5-Excel-%E5%8A%9F%E8%83%BD-CSDN%E5%8D%9A%E5%AE%A2/)中给大家介绍了 Java 是如何写入 Excel 的,那么这篇算是对上篇文章的拓展,主要介绍前端和后端分别是如何导出数据至 Excel 的。
前端导出 Excel
我就用之前比赛的项目给大家演示吧,其组件库为 Ant Design Vue,框架为 Vue3,使用的第三方库为 XLSX。整体的实现并不困难只需写两个函数即可,话不多说直接上代码。
安装命令
1 | npm install XLSX |
引入 XLSX
1 | import * as XLSX from 'xlsx'; |
vue 的 template 部分
1 | <template> |
ts 导出 Excel 代码
1 | // 将 Table 组件的数据转为 Excel 数据 |
ts 请求后端接口代码
1 | watchEffect(async () => { |
后端代码
Controller 层:
1 |
|
SaleData:
1 |
|
前端导出主要是通过 XLSX 这个库实现的,其根据 Ant Design 的 Table 组件的 columns 属性和后端返回的 List 构建成了一个 Excel 文件,最后利用 writeFile 方法导出 Excel 文件。
点击“导出表格数据”按钮,可以看到数据已导出至 Excel 中了。
优点:简单,便捷
缺点:
- 不灵活,不适合非固定表头和复杂的表头
- 前端导出不适合数据量大的场景,因为页面会卡死
后端导出 Excel
据我了解的后端实现导出 Excel 的功能主要有两种。一种是将 Excel 写入流中,前端拿到文件流再转为 blob 后进行下载,另一种是将 Excel 文件转为 base64 编码,前端将 base64 编码转为 blob 再下载。由此可见最终都是要转为 blob 的,拿到 blob 就好搞了。
后端将 Excel 写入流中
后端代码
Controller 层:
1 |
|
ts 代码
1 | const downloadExcel = () => { |
点击“Excel 下载”按钮导出数据。
优点:
- 会有跨域问题
缺点:
- 传输效率高,网络负载小
- 内存占用,适合传输大文件
后端返回 base 64 编码,前端再转为 blob
后端代码
1 |
|
ts 代码
1 | const exportData = async () => { |
主要分为三个阶段,首先后端将文件写入流中再将流转为 base64 编码返回给前端,第二步前端拿到 base64 编码将其转为 blob,最后根据 blob 进行下载。
点击“导出数据”按钮导出数据。
优点:
- 传输数据是 base64 字符串便于调试
- 跨域问题少
缺点:
- 内存占用大,适合传输小文件
- 传输效率低
全部代码
前端
1 | <!-- eslint-disable vue/multi-word-component-names --> |
后端
Controller 层:
1 |
|
SaleData:
1 |
|
总结
相信大家看完也能学会导出 Excel,可以根据具体的开发需求选择不同的方案,如果有更好的方案欢迎探讨哈。