将 json 转为 excel 表并下载
背景
通过访问接口,获取 json 数据,将 json 转为 excel 表并下载。
工具
- react
- js-xlsx
步骤
安装 jsx-xlsx 包
1 | npm i js-xlsx -S |
引入
1 | const XLSX = require("xlsx"); |
实现效果
假设我们从后端返回的数据如下:
1 | student: [ |
数据含义说明
属性名称 | 中文含义 | 备注 |
---|---|---|
id | id | |
stuNo | 学号 | 8 位 |
name | 名字 | |
age | 年龄 | |
major | 专业 | |
isParty | 是否是党员 | 否:0,是:1 |
sex | 性别 | 男:0, 女:1 |
最终想要实现的效果如下:
实现思路
因为 js-xlsx 对应的数据组合如下:
1 | [ |
所以我们需要将数据进行组合
1 | // 置换数据,将是否党员的0和1换成是和否;将性别中的0和1换成'男'和'女' |
组合之后,使用 xlxs 转换为 excel 表并提供下载即可。
合并单元格
只涉及列合并
如果我们想将上下相邻且单元格合并,那么需要操作 sheet[‘!merges’]属性。
1 | !merges :[ |
!merges 属性说明
s: start 开始位置
r: row 行
c: column 列
!merges 中的每一个元素表示的是合并的位置。合并的位置由两部分组成,一部分是合并开始的位置{s:{r:-1,c:-1}};
另一部分是合并结束的位置{e:{r:-1,c:-1}}。如假如有一组元素 [{s:{r:1,c:1}},{e:{r:3,c:1}}]
表示的是合并第二列、第二行至第四行的数据
首先经过转换,我们的数据应该如下,拿到这个数组。
1 | [ |
找出上下相邻并相等的数据,记录下来
1 | /** |
给工作表加上!merge 属性
1 | let merges = this.getMergeData(studentTable); |
合并效果:
全部代码
1 | constructor(props) { |
其他
将 json 数据转为字符串,最后组合成 csv 文件下载。
1 | const data = "..."; // 这里填CSV内容的字符串 |
参考
SheetJS/js-xlsx: SheetJS Community Edition – Spreadsheet Toolkit
如何使用 JavaScript 实现纯前端读取和导出 excel 文件-好记的博客如何使用 JavaScript 实现纯前端读取和导出 excel 文件-好记的博客