使用XLSX前端导出element表格(解决fixed属性导致的数据重复问题)
安装依赖,主要使用两个依赖(xlsx和file-saver)
npm install --save xlsx file-saver
在src文件下的components文件夹中新建一个download.vue文件
<template>
<el-button
type="success"
:loading="downloadLoading"
size="mini"
icon="el-icon-download"
@click="exportExcel"
>下载</el-button
>
</template>
<script>
import FileSaver from "file-saver";
import XLSX from "xlsx";
export default {
props: {
id: {
type: String, //table ID名称
default: "table",
},
name: {
type: String, //导出需要的名字
default: "Table",
},
fixed: {
type: Boolean, //导出的element UI表格中是否使用fixed属性固定列
default: false,
},
},
data() {
return {
downloadLoading: false,
};
},
components: {},
methods: {
// 导出Excel表格
exportExcel() {
this.downloadLoading = true;
var xlsxParam = { raw: true }; //转换成excel时,使用原始的格式
/* 从表生成工作簿对象 */
let table = document.querySelector("#" + this.id).cloneNode(true);
if (this.fixed) {
// 因为element-ui的表格的fixed属性导致多出一个table,会下载重复内容,这里删除掉
table.removeChild(table.querySelector(".el-table__fixed"));
}
var wb = XLSX.utils.table_to_book(table, xlsxParam);
/* 获取二进制字符串作为输出 */
var wbout = XLSX.write(wb, {
bookType: "xlsx",
bookSST: true,
type: "array",
});
try {
FileSaver.saveAs(
//Blob 对象表示一个不可变、原始数据的类文件对象。
//Blob 表示的不一定是JavaScript原生格式的数据。
//File 接口基于Blob,继承了 blob 的功能并将其扩展使其支持用户系统上的文件。
//返回一个新创建的 Blob 对象,其内容由参数中给定的数组串联组成。
new Blob([wbout], {
type: "application/octet-stream",
}),
//设置导出文件名称
this.name + ".xlsx"
);
} catch (e) {
if (typeof console !== "undefined") console.log(e, wbout);
}
this.downloadLoading = false;
return wbout;
},
},
};
</script>
分析:我使用了el-table的fixed属性来让某一列固定,但elementui的实现方式是:创建了两个tabledom,通过一个隐藏一个显示来实现交互效果。当我导出整个el-table 就会将两个div内的table都导出,导致数据重复。
所以如果element的表中如果使用了fixed属性,那么在使用xlsx导出的时候要修改克隆的元素,将该dom的多余table删除
一定要修改克隆元素,如果对原本元素修改会影响页面的table。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端