第一步:安装插件
npm -i xlsx
第二步:main.js 挂载插件
import xlsx from "xlsx"
Vue.prototype.xlsx = xlsx
第三步:编写导出组件,在使用xlsx,要使用this。
<template>
<!-- 批量导出按钮 -->
<div class="searchBox">
<el-button type="success" @click="exportExcel">导出EXCEL</el-button>
</div>
</template>
<script>
//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
//例如:import 《组件名称》 from '《组件路径》';
export default {
//import引入的组件需要注入到对象中才能使用
components: {},
props: {
//父组件选中的数据
selectionData:{
type:Array,
default:null
},
},
data() {
//这里存放数据
return {
loading: false, //表格加载动画是否开启
};
},
//监听属性 类似于data概念
computed: {},
//监控data中的数据变化
watch: {},
//方法集合
methods: {
// 批量导出EXCEL
exportExcel() {
let selectionData = this.selectionData;
if (selectionData.length === 0) {
this.$message({
message: "请选择你要导出的客户数据",
type: "warning",
});
return;
}
// 加上一个loading 正在处理中....
let loading = this.$loading({
text: "正在处理中...",
background: "rgba(0, 0, 0, 0.7)",
});
// 把选中的数据导出成一个excel
// formatJSONWeet(selectionData) 数据转换 name -> 姓名
console.log("前",selectionData);
selectionData = this.formatJSONWeet(selectionData);
console.log("后",selectionData);
let sheet = this.xlsx.utils.json_to_sheet(selectionData);
// https://www.jianshu.com/p/ea115a8e9107
var book = this.xlsx.utils.book_new(); // 创建一个excel
this.xlsx.utils.book_append_sheet(book, sheet, "客户列表"); // 指定表名
this.xlsx.writeFile(book, `customlist${new Date().getTime()}.xlsx`); // 指定excel文件名
loading.close();
this.$emit('clearSelectionData',this.selectionData); //向父组件传递方法,关闭选择的选项
},
formatJSONWeet(result) {
//根据自己的需要导出自己对应的字段
let propertyMap = {
编号: {
key: "userId",
type: "number",
},
姓名: {
key: "username",
type: "string",
},
状态: {
key: "status",
type: "string",
rule: (val) => {
return val == 0 ? "禁用" : "启用";
},
},
邮箱: {
key: "email",
type: "string",
},
电话: {
key: "mobile",
type: "string",
},
};
return result.map(item => {
let obj = {};
Object.keys(propertyMap).forEach(key => {
let {
type,
key: keyMap,
rule
} = propertyMap[key];
let value = item[keyMap];
typeof rule === "function" ? value = rule(value) : null;
switch (type) {
case 'string':
value = String(value);
break;
case 'number':
value = Number(value);
break;
}
obj[key] = value;
});
return obj;
});
},
},
//生命周期 - 创建完成(可以访问当前this实例)
created() {},
//生命周期 - 挂载完成(可以访问DOM元素)
mounted() {},
beforeCreate() {}, //生命周期 - 创建之前
beforeMount() {}, //生命周期 - 挂载之前
beforeUpdate() {}, //生命周期 - 更新之前
updated() {}, //生命周期 - 更新之后
beforeDestroy() {}, //生命周期 - 销毁之前
destroyed() {}, //生命周期 - 销毁完成
activated() {}, //如果页面有keep-alive缓存功能,这个函数会触发
};
</script>
<style>
</style>
在页面中使用
<template>
<!-- 导出组件 -->
<exportComponents :selectionData="dataListSelections" @clearSelectionData="clearDataList"></exportComponents>
</template>
<script>
import exportComponents from "@/components/export/export";
export default {
components: {
exportComponents
},
methods: {
//清空选项数据
clearDataList(){
this.$refs.multipleTable.clearSelection();
},
}
}
</script>