背景
在工作中我们需要对后端返回的数据,然后导出excel进行展示。
注意:
SheetJS
只支持普通的导出,如果想要支持丰富的功能(比如:修改导出excel表格的样式或者数据验证等等)就需要使用付费版。excel表格的样式等更高级的功能我们可以使用其他第三方库(exceljs
)实现
基本使用
<template>
<div class="app">
<button @click="exportExcel">点击导出excel</button>
</div>
</template>
<script>
import * as XLSX from "xlsx";
export default {
data() {
return {
tableData: [
{
employee_id: 100,
first_name: "Steven",
phone_number: "123456789",
hire_date: "1987-06-17",
},
{
employee_id: 101,
first_name: "Neena Kochhar",
phone_number: "123456789",
hire_date: "1989-09-21",
},
{
employee_id: 102,
first_name: "Alexander",
phone_number: "5874517",
hire_date: "1990-01-03",
},
],
};
},
methods: {
// 3. 需求:解决步骤2要自己去转换成二维数组的问题;
// 使用XLSX.utils.json_to_sheet的方法
// 缺点:如果数组对象中包含不存在的表头对应键的话也会展示在excel中
async exportExcel() {
let tableData = [
{
id: 1,
name: "张三",
age: 18,
address: "广州市",
hire_date: "2023-06-03",
},
{ id: 2, name: "李四", age: 16 },
{ id: "3", name: "王五", age: 20 },
];
const excel_map = [
{ label: "ID", prop: "id" },
{ label: "Name", prop: "name" },
{ label: "Age", prop: "age" },
{ label: "雇佣日期", prop: "hire_date" },
];
const excel_header = excel_map.map((item) => item.prop);
var filename = "测试2.xlsx";
var ws_name = "sheet(2)";
// 根据表头转换数据
const excel_data = tableData.map((item) => {
let obj = {};
for (let key of excel_header) {
obj[key] = item[key];
}
return obj;
});
// 自定义表头
const first_row = {};
for (let map of excel_map) {
first_row[map.prop] = map.label;
}
excel_data.unshift(first_row);
var ws = XLSX.utils.json_to_sheet(excel_data, {
header: excel_header,
// 忽略插件设置的表头,常用在自定义表头。
// 我们表头一般想要单词或者中文的,但是这种作为对象的键就不友好了
skipHeader: true,
});
var wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, ws, ws_name);
XLSX.writeFileXLSX(wb, filename);
},
// 2. 需求:后端返回的是一个JSON数组,
/* async exportExcel() {
const tableData = [
{ id: 1, name: "张三", age: 18 },
{ id: 2, name: "李四", age: 16 },
{ id: "3", name: "王天霸", age: 20 },
];
// 表头顺序以及表头与字段映射
const excel_map = [
{ label: "ID", prop: "id" },
{ label: "Name", prop: "name" },
{ label: "Age", prop: "age" },
];
let newData = tableData.map((item) => {
let row = [];
for (let o of excel_map) {
row.push(item[o["prop"]]);
}
return row;
});
// 添加表头
const excel_label = excel_map.map((item) => item.label);
newData.unshift(excel_label);
var filename = "测试2.xlsx";
var ws_name = "sheet(2)";
var ws = XLSX.utils.aoa_to_sheet(newData);
var wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, ws, ws_name);
XLSX.writeFile(wb, filename);
}, */
// 1. 普通方式
/* async exportExcel() {
// 文件名称
var filename = "测试1.xlsx";
//数据,一定注意需要时二维数组
var data = [
[1, 2, 3],
[true, false, null, "sheetjs"],
["foo", "bar", new Date("2014-02-19T14:30Z"), "0.3"],
["baz", null, "qux"],
];
//Excel第一个sheet的名称
var ws_name = "sheet(1)";
// 创建sheet
var ws = XLSX.utils.aoa_to_sheet(data);
// 创建wokbook
var wb = XLSX.utils.book_new();
// 将数据添加到工作薄
XLSX.utils.book_append_sheet(wb, ws, ws_name);
// 导出文件
XLSX.writeFile(wb, filename);
}, */
},
};
</script>
<style scoped></style>