简介
通常我们前端导出Excel文件都是通过后端返回的一个url
地址给前端,然后前端这边可以通过axios
流式下载变成一个excel文件,或者是将url
地址放在一个a
标签里,然后用户点击a
标签时浏览器就会调用自身的下载功能进行下载了。
{% note info orange %}
但是最近项目就遇到了一个问题,后端这边将数据直接返回给前端这边了,前端这边将数据渲染成一个表格,然后导出的时候用前端的方式去导出一个Excel.csv
的文件(csv
本质上也是excel
文件),之前也没做过这种,感觉好像挺难的,后来百度一下(万能的百度
),发现实现也挺简单的(不多说,ctrl v + ctrl c
),然后再结合自身项目要求改一下就行了!为了方便下次查阅使用,写成md自己记下来。
{% endnote %}
导出
这是页面大概样式 导出按钮功能代码
const handleExport = () => {
// 将自己想要导出的字段将它格式化
const tempList = infiniteList.map((item) => ({
Id: item.id, Name: item.name, Email: item.email, Location: item.address.country, Phone: item.phone
}));
let str = 'Id,Name,Email,Location,Phone\n';
// 增加\t为了不让表格显示科学计数法或者其他格式
for (let i = 0; i < tempList.length; i++) {
// eslint-disable-next-line no-restricted-syntax
for (const item in tempList[i]) {
str += `${`${tempList[i][item]}\t`},`;
}
str += '\n';
}
// encodeURIComponent解决中文乱码
const uri = `data:text/csv;charset=utf-8,\ufeff${encodeURIComponent(str)}`;
// 通过创建a标签实现
const link = document.createElement('a');
link.href = uri;
// 对下载的文件命名
link.download = 'json数据表.csv';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
};
导出的excel文件