基于xlsx.js的前端导出单sheet的Excel实现案例详解
2023-09-08 13:56:49
之前由于公司有excel导出的需求,后端开发人手不足,为了及时完成项目需求,就基于sheet.js中的xlsx.js结合网上案例做了一个单sheet和多sheet的Excel导出功能。该示例是单sheet的Excel导出,多sheet的导出过几天会整理发布出来!
注意:该方法有一个弊端,只能导出单sheet的数据,如果数据比较多,很可能被浏览器限制而报错!
这里先介绍一下sheetjs和xlsx的库:
sheetjs 是用于解析和生成电子表格的JavaScript库。它支持多种电子表格格式,包括.xlsx、.xls、.ods和.csv。xlsx 是sheetjs库的一部分,用于处理.xlsx电子表格格式。xlsx.js文件是通过sheetjs包中的rollup.js通过ES模块转化的,rollup.js是一个类webpack的打包库,可以将其转换JS模块为ES模块,打包为xlsx.js文件。
下面是引入库的方法:
<script type="text/javascript" src="https://cdn.bootcss.com/xlsx/0.16.2/xlsx.full.min.js"></script>
功能实现方面,如果是后台人员,直接用库就行,无需过多的配置。如果是前端,就需要做一些配置来引入项目,以下是步骤:
1、下载库并解压;
2、安装npm(具体安装方法百度或者咨询前端同学);
3、终端到sheetjs-master目录下执行npm install
;
4、终端执行 webpack --env production
生成可发布的xlsx.js文件;
5、把xlsx.js文件拷贝到项目中;
6、用script引入。
Excel导出的实现步骤:
1、配置excel头,即导出的Excel的表头,可以自定义;
2、创建空白Excel,相当于创建表格主体;
3、将配置好的excel头写入excel中;
4、将数据写入excel中;
5、将excel导出成json数据;
6、调用下载链接,用a标签实现下载。
以下是代码实现:
//表格头部
const titles = ['姓名', '年龄', '性别'];
//表格主体
let s = {
sheet: {},
cols: [], //列配置
data: [] //数据
};
// 添加列配置
titles.forEach((item) => {
s.cols.push({wch: 10})
});
// 给Excel添加头部
s.data.push(titles);
//写入数据
tableData.forEach((item, index) => {
//以下几行是实现数据对齐居中的操作,可注释掉,效果是数据内容左对齐
// var col = s.cols[index];
// col.style = {align:'center'};
s.data.push([item.userName, item.age, item.sex]);
});
//sheet名称
let sheetName = 'sheet1';
/*
* 生成excel
* 参数1:workbook对象
* 参数2:工作表名称
*/
let wb = {
SheetNames: [sheetName],
Sheets: {}
};
wb.Sheets[sheetName] = s;
//导出json数据,根据options中自定义的下载文件名
let wbout = XLSX.write(wb, {
bookType: 'xlsx',
bookSST: true,
type: 'array'
});
let excelName = 'test';
//导出excel格式文件
saveAs(new Blob([wbout], {
type: "application/octet-stream"
}), excelName + ".xlsx")
这仅仅是单sheet的一个简单的示例,目的是为了快速解决excel导出的问题,在实际开发中,还是有一些复杂的需求需要注意的,比如下面的一些问题:
1、sheetjs限制的数据量在65535行×255列,超过这个数量需要做一些技巧性处理,例如合并多个sheet,设置行高列宽等。
2、数据如何处理,每个数据的类型是什么,如何区分,有些数据类型可能需要转成字符串才能放入到excel表格中,不然会有冲突。
3、兼容性:应兼容.xlsx、.xls等多种excel格式,前端处理比较困难,需要后端支持。
4、防止表格出现乱码的情况。
5、解决浏览器下载的限制。
好了,相信大家对使用xlsx.js导出excel表格已经有了一定程度的了解,如果您在使用xlsx.js的过程中遇到任何问题,可以随时提问。