安装 file-saver、xlsx、xlsx-style
"file-saver": "^2.0.5",
"xlsx": "^0.17.0",
"xlsx-style": "^0.8.13"
npm i xlsx@0.17.0 -S
npm i xlsx-style@0.8.13 -S
npm i file-saver -S
配置vue.config.js
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
transpileDependencies: true,
configureWebpack: {
externals: {
'./cptable': 'var cptable'
},
resolve: { fallback: { fs: false } }
}
})
导出excel表格
import { ElMessageBox } from 'element-plus'
import XLSX from "xlsx";
import XLSXS from 'xlsx-style'
import FileSaver from 'file-saver'
const tableData = [
{
date: '2016-05-03',
name: 'Tom',
address: '123',
},
{
date: '2016-05-02',
name: 'Tom',
address: '456',
},
{
date: '2016-05-04',
name: 'Tom',
address: '789',
},
{
date: '2016-05-01',
name: 'Tom',
address: '147',
},
{
date: '2016-05-08',
name: 'Tom',
address: '258',
},
{
date: '2016-05-06',
name: 'Tom',
address: '369',
},
{
date: '2016-05-07',
name: 'Tom',
address: 'No. 189, Grove St, Los Angeles',
}
]
const exportAllFile = () => {
ElMessageBox.confirm(
'是否确认导出全部数据?',
'警告',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}
)
.then(() => {
exportList(tableData)
})
}
const exportList = (arr) => {
let table = [
['幼儿园课表', null, null, null],
["序号", '时间', '姓名', "地址"]
]
arr.forEach((item, index) => {
let rowData = []
rowData = [
index + 1,
item.date,
item.name,
item.address,
]
table.push(rowData)
})
let bookNew = XLSX.utils.book_new();
let workSheet = XLSX.utils.aoa_to_sheet(table);
XLSX.utils.book_append_sheet(bookNew, workSheet, '作品名称')
workSheet['!merges'] = [
{ s: { r: 0, c: 0 }, e: { r: 0, c: 3 } },
{ s: { r: 7, c: 1 }, e: { r: 8, c: 2 } },
]
setExlStyle(workSheet)
workSheet['!cols'] = [
{ wpx: 80},
{ wpx: 100},
{ wpx: 180},
{ wpx: 400}
]
let wbout = XLSXS.write(bookNew, {
bookType: 'xlsx',
bookSST: false,
type: 'binary',
})
FileSaver.saveAs(
new Blob([s2ab(wbout)], {
type: 'application/octet-stream'
}),
'全部人员.xlsx'
)
}
function s2ab(s) {
var buf = new ArrayBuffer(s.length)
var view = new Uint8Array(buf)
for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xff
return buf
}
const setExlStyle = (data) => {
let borderAll = {
top: {
style: "thin",
},
bottom: {
style: "thin",
},
left: {
style: "thin",
},
right: {
style: "thin",
},
diagonal: {
style: "thin",
color: "red"
},
};
for (let key in data) {
if (key === 'A1') {
data[key].s = {
font: {
name: '宋体',
sz: 20,
color: { rgb: 'ff0000' },
bold: true,
},
fill: {
patternType: 'solid',
bgColor: {
rgb: "0000FF",
},
fgColor: {
theme: "2",
tint: "-0.25"
}
},
}
continue;
}
if (data[key] instanceof Object) {
data[key].s = {
border: borderAll,
alignment: {
vertical: 'center',
horizontal: 'center',
},
font: {
name: '宋体',
sz: 20,
color: { rgb: '' },
bold: false,
},
bold: true,
numFmt: 0,
};
}
}
return data;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了