前些天产品提了个需求 要导出当前页面的数据,对于第一次写导出文件的我无从下手(之前都是后端写好丢给前端的),去网上搜了很多也没找到自己想要的效果。于是我科学上网了一波 找到了一个名为 xlsx-js-style 的包,然后根据这个包,完成了这个棘手的需求(我是前端小白),废话不多说,来上代码。
// 首先得先下载这个包
npm i xlsx-js-style
// 然后在自己开发的文件夹里引入
import XLSXS from "xlsx-js-style";
这是完整代码,我用的是vue3哈 没用ts 代码很庸愚,你们可以到时候根据数据来进行push操作。
push数据的时候,看看你们的数据需要在哪一行下push ,然后从push那一行起 后面的数据都是像堆俄罗斯方块似的堆上去。
<template>
<div>
<button @click="exportToExcel">导出为Excel</button>
</div>
</template>
<script setup>
import {ref} from 'vue'
// import { saveAs } from 'file-saver'
// import XLSX from 'xlsx-js-style'
import XLSXS from "xlsx-js-style";
const exportToExcel = ()=>{
// 创建一个新的工作簿
const wb = XLSXS.utils.book_new();
// sheet工作簿标题
const sheetName = "xlsx导出带样式";
// 创建数据行和样式
let rowArray = [
// 人才发展历程
[{
v: "人才发展历程",
t: "s",
s: {
font: {
name: "Courier",
sz: 24,
bold: true,
color:'b8ddb0'
},
fill: { fgColor: { rgb: '9e9e9e' } }
}
}],
[{
v: "姓名",
t: "s",
s: {
font: {
name: "Courier",
rgb: "E9E9E9"
},
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "王大",
t: "s",
s: {
font: {
bold: true,
color: {
rgb: "FF0000"
}
}
}
},
{
v: "部门",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "管理服务部",
t: "s",
s: {
alignment: {
wrapText: true
}
}
},
{
v: "岗位",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "web全栈开发",
t: "s",
s: {
alignment: {
wrapText: true
}
}
},
],
[{
v: "入职时间",
t: "s",
s: {
font: {
name: "Courier",
rgb: "E9E9E9"
}
}
},
{
v: "2021.03.06",
t: "s",
s: {
font: {
bold: true,
color: {
rgb: "FF0000"
}
}
}
},
{
v: "司龄",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "8.5",
t: "s",
s: {
alignment: {
wrapText: true
}
}
},
{
v: "职级职等",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "P4",
t: "s",
s: {
alignment: {
wrapText: true
}
}
},
],
[{
v: "学历",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "本科",
t: "s",
s: {
font: {
bold: true,
color: {
rgb: "FF0000"
}
}
}
},
{
v: "毕业院校",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "南京科技大学苏州信息学院",
t: "s",
s: {
alignment: {
wrapText: true
}
}
},
{
v: "专业",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "畜牧养殖",
t: "s",
s: {
alignment: {
wrapText: true
}
}
},
],
[{
v: "诗选之星",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "总计:2次",
t: "s",
s: {
font: {
bold: true,
color: {
rgb: "FF0000"
}
},
width:80
}
},
],
[{
v: "半年绩效",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "A:1次,A:1次,A:1次,A:1次,A:1次",
t: "s",
s: {
// r:0,
// c:0,
// e:{r:3,c:0},
font: {
bold: true,
color: {
rgb: "FF0000"
},
},
}
},
],
// 工作经历(由近到远填写)
[{
v: "工作经历(由近到远填写)",
t: "s",
s: {
r:0,
c:4,
font: {
name: "Courier",
sz: 24,
bold: true,
color:'b8ddb0'
},
fill: { fgColor: { rgb: '9e9e9e' } }
}
}],
// 表头
[{
v: "起止年月",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "工作单位",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "工作单位",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "在职岗位",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
}
],
// 公司荣誉
[{
v: "公司荣誉",
t: "s",
s: {
r:0,
c:4,
font: {
name: "Courier",
sz: 24,
bold: true,
color:'b8ddb0'
},
fill: { fgColor: { rgb: '9e9e9e' } }
}
}],
// 表头
[{
v: "时间",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "荣誉类型",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "入选原因",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
],
// 学习历程
[{
v: "学习历程",
t: "s",
s: {
r:0,
c:4,
font: {
name: "Courier",
sz: 24,
bold: true,
color:'b8ddb0'
},
fill: { fgColor: { rgb: '9e9e9e' } }
}
}],
// 表头
[{
v: "学习时间",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "学习方式",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "学习课程",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "学习课程",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "地点",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "考核分数",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
],
// 调薪记录
[{
v: "调薪记录",
t: "s",
s: {
r:0,
c:4,
font: {
name: "Courier",
sz: 24,
bold: true,
color:'b8ddb0'
},
fill: { fgColor: { rgb: '9e9e9e' } }
}
}],
// 表头
[{
v: "时间",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "职级职等",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "综合薪资",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "类型",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "调整原因",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
],
// 年度积分
[{
v: "时间",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "年度积分",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "年度积分",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "年度积分",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "年度建议",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "年度建议",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
],
[{
v: "时间",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "意见",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "采纳数量",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "任务",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "提出数量",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
{
v: "采纳数量",
t: "s",
s: {
fill: {
fgColor: {
rgb: "E9E9E9"
}
}
}
},
],
];
// 创建带有行的工作表;将工作表添加到工作簿
const ws = XLSXS.utils.aoa_to_sheet(rowArray,{raw:true});
XLSXS.utils.book_append_sheet(wb, ws, sheetName);
//默认最大列数
let maxColumnNumber = 1;
rowArray.map(item=>item.length>maxColumnNumber?maxColumnNumber=item.length:'');
//合并 #将第一行标题列合并
ws['!merges'] = [
// 人才发展历程
XLSXS.utils.decode_range('A1:F1'),
XLSXS.utils.decode_range('B5:F5'),
XLSXS.utils.decode_range('B6:F6'),
// 工作经历
XLSXS.utils.decode_range('A7:F7'),
XLSXS.utils.decode_range('A8:B8'),
XLSXS.utils.decode_range('C8:D8'),
XLSXS.utils.decode_range('E8:F8'),
// 公司荣誉
XLSXS.utils.decode_range('A9:F9'),
XLSXS.utils.decode_range('C10:F10'),
// 学习历程
XLSXS.utils.decode_range('A11:F11'),
XLSXS.utils.decode_range('C12:D12'),
// 调薪历程
XLSXS.utils.decode_range('A13:F13'),
XLSXS.utils.decode_range('E14:F14'),
// 年度积分
XLSXS.utils.decode_range('A15:A16'),
XLSXS.utils.decode_range('B15:D15'),
XLSXS.utils.decode_range('E15:F15'),
];
console.log(ws);
//边框样式
let borderStyle = {
top: {
style: "thin",
color: {
rgb: "000000"
}
},
bottom: {
style: "thin",
color: {
rgb: "000000"
}
},
left: {
style: "thin",
color: {
rgb: "000000"
}
},
right: {
style: "thin",
color: {
rgb: "000000"
}
}
}
//添加外边框
rowArray.map((item,index)=>{
for(let i=1;i<=maxColumnNumber;i++){
if(!ws[''+String.fromCharCode(64 + parseInt(i))+(index+1)]){
ws[''+String.fromCharCode(64 + parseInt(i))+(index+1)] = {v:'',t:'s',s:{border:borderStyle}};
continue ;
}
//边框
ws[''+String.fromCharCode(64 + parseInt(i))+(index+1)].s.border = borderStyle;
//字体居中
ws[''+String.fromCharCode(64 + parseInt(i))+(index+1)].s.alignment = { vertical: 'center', horizontal: 'center' }
}
})
//添加列宽
ws['!cols'] = ([{
width: 20
}, {
width: 20
}, {
width: 20
}, {
width: 20
}, {
width: 20
}, {
width: 20
}
]);
//添加行高
ws['!rows'] = [
{ 'hpt': 40 },
{ 'hpt': 40 },
{ 'hpt': 40 },
{ 'hpt': 40 },
{ 'hpt': 40 },
{ 'hpt': 40 },
{ 'hpt': 40 },
{ 'hpt': 40 },
{ 'hpt': 40 },
{ 'hpt': 40 },
{ 'hpt': 40 },
{ 'hpt': 40 },
{ 'hpt': 40 },
{ 'hpt': 40 },
];
// 将Excel文件写入浏览器 #导出
XLSXS.writeFile(wb, sheetName+".xlsx");
}
</script>