React使用xlsx和js-export-excel实现前端导出
背景
在数据量不太大,或者开发周期比较急迫的情况下,可以把导出excel功能放到前端实现。
这里笔者结合实际开发的经验,由于我司开发技术选型为React,最终选择
js-export-excel (1.1.4) 和 xlsx (0.18.5)
分别进行介绍如何实现前端导出excel功能。
前置数据模拟以及导出预期结果
mock导出的数据
const dataTable = [ {index: "1", name: "niko", age: "18", birth: "Mon Dec 11 10:08:15 CST 2023"}, {index: "1", name: "vivi", age: "16", birth: "Sun Dec 11 10:49:18 CST 2023"}, ]
预期导出效果
只需要序号,姓名和年龄字段,且工作表名为个人信息表
js-export-excel
import ExportJsonExcel from 'js-export-excel'; const jsExportExcelHandle = (dataTable = []) => { const option = []; option.fileName = "个人信息文件"; const sheetData = dataTable; // 有需要映射的话需要先映射 const sheetFilter = ["index", "name", "age"]; const sheetHeader = ["序号", "姓名", "年龄"]; option.datas = [ { sheetData, sheetName: "个人信息表", sheetFilter, sheetHeader, columnWidth: new Array(sheethaeader.length).fill(10); // 列宽 } ]; const toExcel = new ExportJsonExcel(option); toExcel.saveExcel() }
xlsx
import { utils, writeFile } from 'xlsx'; const xlsxHandle = (dataTable = []) => { // 表头映射为中文 const headerMap = { index: "序号", name: "姓名", age: "年龄", }, // 先过滤出需要的属性 const headList = Object.keys(headerMap); // 返回新的对象数组 const _dataTable = dataTable.map(item => { const filteredItem = {}; Object.keys(item).forEach(key => { if(headList.includes(key)){ filteredItem[key] = item[key]; } }) return filteredItem }) // xlsx需要转为二维数组 const dataArr = _dataTable.map(item => Object.values(item)); // 将表头映射为中文(name => 姓名) const headerTranslated = Object.keys(headerMap).map(key => header[key]);//["序号", "年龄", "姓名"] dataArr.unshif(headerTranslated); // 插入 const workSheet = utils.aoa_to_sheet(dataArr); // 转为工作表对象 // 设置每个的单元格的列宽 workSheet["!cols"] = new Array(headList.length).fill({wch: 20}); // {!cols:(13)[{wch:20},...],A1:{v: "序号", t: "s"},...} const workBook = utils.book_new(); utils.book_append_sheet(workBook, workSheet); // writeFile 方法只能在 node 环境下使用。 writeFile(workBook, "个人信息文件.xlsx", { Props: { // 作者的相关信息 title: "个人信息明细", creator: window.User, } }) }
worksheet['!cols']
:存储列对象的数组,可以在这里设置列宽。
//wpx 字段表示以像素为单位,wch 字段表示以字符为单位 worksheet['!cols'] = [ { wpx: 200 }, //设置第1列列宽为200像素 { wch: 50 }, //设置第2列列宽为50字符 ];
单元格对象中的属性
//设置A1单元格的值是序号,类型是字符串,字体颜色是FF0187FA worksheet["A1"] = { v: "序号", t: "s", s: { font: { color: { rgb: "FF0187FA" } }, } }
总结
其实js-export-excel是在xlsx的基础上二次封装的,以上是个人工作中对于第三方插件使用的一个小记录,有写错的地方还请不吝赐教
2024/1/22更新
使用xlsx转为二维数组的时候,可能导致数据和表头对应不上的问题(23行)
// 应该根据表头headerMap重新组装每一行的对象 const dataArr = _dataTable.map(item => Object.keys(headerMap) .map(key => item[key]) )
到此这篇关于React使用xlsx和js-export-excel实现前端导出的文章就介绍到这了,更多相关React前端导出内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
关于React中使用window.print()出现页面无响应问题解决记录
这篇文章主要介绍了React中使用window.print()出现页面无响应问题解决记录,首先问题原因可能是操作了document但是并未进行销毁(可能是),具体问题解决思路参考下本文吧2021-11-11React报错Element type is invalid解决案例
这篇文章主要为大家介绍了React报错Element type is invalid解决案例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-12-12详解React-Native全球化多语言切换工具库react-native-i18n
这篇文章主要介绍了详解React-Native全球化语言切换工具库react-native-i18n,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-11-11
最新评论