vue导出excel并修改表头样式

article/2025/9/14 0:42:13

vue导出excel并修改样式

本文参考CSDN蓝色的落叶(侵删)

DEMO下载

  1. 安装插件
    npm install --save xlsx(修改样式需要下载npm install --save xlsx-style)
    npm install -S file-saver
    npm install -D script-loader
    安装npm install --save xlsx-style会出现找不到cpexcel.js的错误
    解决方案:创建自定义node_moduls文件夹替换插件内文件(vue修改插件源码)或直接修改源码
    \node_modules\xlsx-style\dist\cpexcel.js 807行 的 var cpt = require(’./cpt’ + ‘able’); 改成 var cpt = cptable;
  2. 下载Blob.js文件
  3. 新建一个Export2Excel.js(摘自CSDN蓝色的落叶)
//这是从网上的,改了一点点 Export2Excel.js(此内容转自https://blog.csdn.net/qq_38502227/article/details/101702819)
require("script-loader!file-saver");
import XLSX from "xlsx-style";function datenum(v, date1904) {if (date1904) v += 1462;var epoch = Date.parse(v);return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
}function sheet_from_array_of_arrays(data, opts) {var ws = {};var range = {s: {c: 10000000,r: 10000000},e: {c: 0,r: 0}};for (var R = 0; R != data.length; ++R) {for (var C = 0; C != data[R].length; ++C) {if (range.s.r > R) range.s.r = R;if (range.s.c > C) range.s.c = C;if (range.e.r < R) range.e.r = R;if (range.e.c < C) range.e.c = C;var cell = {v: data[R][C]};if (cell.v == null) continue;var cell_ref = XLSX.utils.encode_cell({c: C,r: R});if (typeof cell.v === "number") cell.t = "n";else if (typeof cell.v === "boolean") cell.t = "b";else if (cell.v instanceof Date) {cell.t = "n";cell.z = XLSX.SSF._table[14];cell.v = datenum(cell.v);} else cell.t = "s";ws[cell_ref] = cell;}}if (range.s.c < 10000000) ws["!ref"] = XLSX.utils.encode_range(range);return ws;
}function Workbook() {if (!(this instanceof Workbook)) return new Workbook();this.SheetNames = [];this.Sheets = {};
}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;
}function export_json_to_excel({title,multiHeader = [],header,data,filename,merges = [],autoWidth = true,bookType = "xlsx"} = {}) {// const merges = [`A1:${getCharCol(list.length - 2)}1`]; //合并单元格/* original data */filename = filename || "excel-list";data = [...data];data.unshift(header);if (title) {data.unshift(title);}for (let i = multiHeader.length - 1; i > -1; i--) {data.unshift(multiHeader[i]);}var ws_name = "SheetJS";var wb = new Workbook(),ws = sheet_from_array_of_arrays(data);if (merges.length > 0) {if (!ws["!merges"]) ws["!merges"] = [];merges.forEach(item => {ws["!merges"].push(XLSX.utils.decode_range(item));});}if (autoWidth) {/*设置worksheet每列的最大宽度*/const colWidth = data.map(row =>row.map(val => {/*先判断是否为null/undefined*/if (val == null) {return {wch: 13};} else if (val.toString().charCodeAt(0) > 255) {/*再判断是否为中文*/return {wch: val.toString().length * 2};} else {return {wch: val.toString().length};}}));// console.log(colWidth);/*以第一行为初始值*/let result = colWidth[0];colWidth[0][0]["wch"] = 13;// console.log(colWidth[0][0]["wch"]);for (let i = 1; i < colWidth.length; i++) {for (let j = 0; j < colWidth[i].length; j++) {if (result[j]["wch"] < colWidth[i][j]["wch"]) {result[j]["wch"] = colWidth[i][j]["wch"];}}}ws["!cols"] = result;}/* add worksheet to workbook */wb.SheetNames.push(ws_name);wb.Sheets[ws_name] = ws;var dataInfo = wb.Sheets[wb.SheetNames[0]];// const borderAll = {//   //单元格外侧框线//   top: {//     style: "thin"//   },//   bottom: {//     style: "thin"//   },//   left: {//     style: "thin"//   },//   right: {//     style: "thin"//   }// };//给所以单元格加上边框// for (var i in dataInfo) {//   if (i == '!ref' || i == '!merges' || i == '!cols' || i == 'A1') {//   } else {//     dataInfo[i + ''].s = {//       border: borderAll//     }//   }// }// 标题行let arr = ["A1","B1","C1","D1","E1","F1","G1","H1","I1","J1","K1","L1","M1","N1","O1","P1","Q1","R1","S1","T1","U1","V1","W1","X1","Y1","Z1"];// arr.some(function(v) {//   let a = merges[0].split(":");//   if (v == a[1]) {//     dataInfo[v].s = {};//     return true;//   } else {//     dataInfo[v].s = {};//   }// });//设置主标题样式let style = {font: {// name: "宋体",// sz: 18,color: { rgb: "000000" },bold: true// italic: false,// underline: false},alignment: {horizontal: "center",vertical: "center"}// fill: {//   fgColor: {rgb: "008000"},// },};// dataInfo["B1"].s = style;// dataInfo["A1"].s = style;//excel标题样式for (var i = 0; i < header.length; i++) {dataInfo[arr[i]].s = style;}var wbout = XLSX.write(wb, {bookType: bookType,bookSST: false,type: "binary"});saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}),`${filename}.${bookType}`);
}
function toExportExcel(tHeader, data, filename) {import("@/utils/excel/Export2Excel").then(excel => {//表头对应字段excel.export_json_to_excel({header: tHeader,data: data,filename: filename,autoWidth: true,bookType: "xlsx"});});
}
export { toExportExcel, export_json_to_excel };
  1. 将Blob.js和Export2Excel.js建立一个excel.js文件(摘自CSDN蓝色的落叶)
(此内容转自https://blog.csdn.net/qq_38502227/article/details/101702819//util.js
import "@/utils/excel/Blob";export { json2excel, getCharCol, formatJson };// function parseTime(time, cFormat) {
//   if (arguments.length === 0) {
//     return null;
//   }
//   const format = cFormat || "{y}-{m}-{d} {h}:{i}:{s}";
//   let date;
//   if (typeof time === "object") {
//     date = time;
//   } else {
//     if (typeof time === "string" && /^[0-9]+$/.test(time)) {
//       time = parseInt(time);
//     }
//     if (typeof time === "number" && time.toString().length === 10) {
//       time = time * 1000;
//     }
//     date = new Date(time);
//   }
//   const formatObj = {
//     y: date.getFullYear(),
//     m: date.getMonth() + 1,
//     d: date.getDate(),
//     h: date.getHours(),
//     i: date.getMinutes(),
//     s: date.getSeconds(),
//     a: date.getDay()
//   };
//   // eslint-disable-next-line
//   const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
//     let value = formatObj[key];
//     // Note: getDay() returns 0 on Sunday
//     if (key === "a") {
//       return ["日", "一", "二", "三", "四", "五", "六"][value];
//     }
//     if (result.length > 0 && value < 10) {
//       value = "0" + value;
//     }
//     return value || 0;
//   });
//   // eslint-disable-next-line
//   return time_str;
// }function json2excel(tableJson, filenames, autowidth, bookTypes) {import("@/utils/excel/Export2Excel").then(excel => {var tHeader = [];var dataArr = [];var sheetnames = [];for (var i in tableJson) {tHeader.push(tableJson[i].tHeader);dataArr.push(formatJson(tableJson[i].filterVal, tableJson[i].tableDatas));sheetnames.push(tableJson[i].sheetName);}excel.export_json_to_excel({header: tHeader,data: dataArr,sheetname: sheetnames,filename: filenames,autoWidth: autowidth,bookType: bookTypes});});
}
// 数据过滤,时间过滤
function formatJson(filterVal, jsonData) {return jsonData.map(v =>filterVal.map(j => {if (j === "timestamp") {return parseTime(v[j]);} else {return v[j];}}));
}// 获取26个英文字母用来表示excel的列
function getCharCol(n) {for (var i = 0; i < this.list.length; i++) {this.list[i].showActive = false;if (index == i) {this.list[index].showActive = true;}}let temCol = "",s = "",m = 0;while (n > 0) {m = (n % 26) + 1;s = String.fromCharCode(m + 64) + s;n = (n - m) / 26;}return s;
}

5.使用

<template><div class="home"><!--    <img alt="Vue logo" src="../assets/logo.png">--><button @click="exportData">Excel导出</button></div>
</template><script>
// @ is an alias to /src
// import HelloWorld from '@/components/HelloWorld.vue'
import {formatJson} from '@/utils/excel/excel'
import {toExportExcel} from '@/utils/excel/Export2Excel'export default {name: 'Home',components: {// HelloWorld},methods: {exportData() {const list = [{name: '小明',age: 16,},{name: '小红',age: 15,},{name: '小刚',age: 16,},]const tHeader = ['姓名', '年龄'] //表头const filterVal = ['name', 'age']//对应list'name',获取对应'value'const data = formatJson(filterVal, list);const filename = "测试";toExportExcel(tHeader, data, filename);},}
}
</script>
效果如下图:

效果图


http://chatgpt.dhexx.cn/article/3UFY3rj2.shtml

相关文章

vue 实现Excel 导出

前言 数据表格的导出&#xff0c;是实际开发的常见功能&#xff0c;前后端都可以实现表格导出&#xff0c;讲解自己在用的一种。 获取数据源&#xff0c;可以通过后端接口实现&#xff0c;也可以利用分页查询的表格接口来实现。 处理数据&#xff0c;对excel表格的表头&#…

vue导出excel并修改样式

1.首先安装以下三个安装包 npm install --save xlsx(修改样式需要下载npm install --save xlsx-style)npm install -S file-savernpm install -D script-loader 注意&#xff1a;如果安装了npm install --save xlsx-style 会报错&#xff1a;This relative module was not fo…

springboot vue导出excel 使用easypoi

springboot vue导出excel 处理后端返回的文件流&#xff0c;下载成excl文件 vue <el-button class"el-icon-download" type"success" click"exportExcel()">导出</el-button>没封装axios exportExcel() {axios({url: 请求地址, …

Vue导出Excel表格信息

一、安装两个依赖包 npm install -S file-saver xlsxnpm install -D script-loader二、项目中新建一个文件夹 里面放置两个文件Blob.js和 Export2Excel.js。 同时注意Export2Excel里引用Blob的路径是否正确。 三、使用案例 3.1、使用注意事项 表头对应的键要和传过来的数据…

vue导出excel表

方法一&#xff1a;vue2.0 element UI 中 el-table 数据导出Excel 。https://blog.csdn.net/u010427666/article/details/79208145 方法二&#xff1a; 1.安装2个依赖包&#xff08;其实是3个&#xff09; npm install -S file-saver xlsxnpm install -D script-loader 2.在…

Vue导出Excel的实现方法与原理

摘要&#xff1a;本文将详细介绍前端Vue中导出Excel的方法&#xff0c;包括使用第三方库和纯前端实现两种方式。同时解释其原理&#xff0c;帮助读者了解如何在Vue项目中高效地导出Excel文件。 第三方库&#xff1a;exceljs exceljs是一款功能强大的JavaScript库&#xff0c;它…

Vue实现excel文件的导出功能(后端直接返回文件流)

✍️ 作者简介: 一个每天中午去打篮球和锻炼的前端开发。 &#x1f408;‍⬛ 两只猫&#x1f431;和一只狗的铲屎官&#x1f436; &#x1f9e3; 微博: GuoJ阝阝&#xff08;fu&#xff09; 文章目录 前言一、实现效果二、实现步骤1、添加导出按钮2、添加点击事件函数3、获取当…

vue导出excel表格(详细教程)

在开发的时候&#xff0c;会经常用的导出excel表格功能,刚好自己开发有遇到&#xff0c;就记录一下 一、安装vue-json-excel npm install vue-json-excel -S二、main.js中引入 import JsonExcel from vue-json-excel Vue.component(downloadExcel, JsonExcel)三、在代码中使…

Vue2中导出Excel

目录 方式一 &#xff1a;vue-json-excel 1、引入vue-json-excel 2、 main.js中全局注册 3、使用 4、效果图 ​​ 方式二&#xff1a;file-saver、xlsx、script-loader 1、引入依赖 2、下载并引入Blob.js和Export2Excel.js 3、使用 4、效果图 导出指定的记录 1、引…

内网建站 NAT穿透 局域网穿透

背景&#xff1a; 一直想搭建个人的博客&#xff0c;但是买云服务器一年动则几千少则几百&#xff0c;想到家里有一台空闲的笔记本&#xff0c;于是乎想到了内网穿透&#xff5e; 准备工作&#xff1a; 个人电脑一台&#xff0c;小蝴蝶内网穿透 步骤一&#xff1a; 搭建好内网博…

内网穿透是什么?

文章目录 内网穿透的目的内网穿透的阻碍如何实现知识点正向代理反向代理 参考&#xff1a; 内网穿透 知识点 内网穿透是什么&#xff0c;如何利用花生壳实现内网穿透 内容从网络上收集而来 内网穿透的目的 使得外网能够访问内网应用。 或者&#xff0c;使得 两个内网能够相互通…

内网穿透-把自己的电脑部署为公网可访问的服务器

推荐一款工具&#xff0c;能够把自己电脑上的项目暴露到公网上、把自己的项目展示给别人看看。 使用很方便&#xff0c;可免费&#xff08;有收费项目&#xff09;使用。 下载 工具叫做 cpolar &#xff0c;其下载地址为&#xff1a;https://i.cpolar.com/m/4GSo &#xff0c…

内网穿透技术有哪些(经验分享)

内网穿透技术&#xff1a;说到内网穿透&#xff0c;相信很多人肯定一知半解&#xff0c;到底什么是内网穿透呢&#xff01;什么情况下需要内网穿透呢&#xff01;接下来给大家简单的述说一下原理&#xff0c;内网穿透&#xff0c;也即 NAT 穿透&#xff0c;进行 NAT 穿透是为了…

可以实现内网穿透的几款工具

https://blog.csdn.net/qq_36468810/article/details/109219639 me批注&#xff1a;现在流行使用cpolar&#xff0c;极客工具&#xff0c;HTTPS安全的隧道穿透&#xff0c;用它来调试微信公众号&#xff0c;远程控制树梅派&#xff0c;超级方便。而且还是免费的。https://cpol…

浅谈内网穿透

内网穿透&#xff0c;也叫NAT穿透&#xff0c;进行NAT穿透是为了使具有某一个特定源ip地址和源端口号的数据包不被NAT设备屏蔽而正确路由到内网主机。 什么是【内网穿透】&#xff1f; 在当前的互联网环境中&#xff0c;由于IPv4的公网地址数量是有限的&#xff0c;无法给每一台…

内网穿透什么意思?内网穿透基础知识原理内网穿透服务器搭建可以干嘛服务器端口映射无需公网IP教程方法

内网穿透什么意思&#xff1f;内网穿透基础知识原理内网穿透服务器搭建可以干嘛服务器端口映射无需公网IP教程方法 什么是内网&#xff08;今天说点大家都能听得懂的&#xff01;&#xff01;&#xff01;&#xff09; 通常情况下&#xff0c;内网 可以简单的理解为路由器创建…

内网穿透的作用 免费内网穿透有哪些 可以用来干什么

相信有很多人都会被一个问题所困惑&#xff0c;我们在日常办公和生活中&#xff1b;一些内网访问的应用&#xff0c;如何让实现在任意外网进行链接访问呢&#xff1f;有人说可以用内网穿透 内网穿透具体是什么&#xff0c;原理是什么&#xff1b;今天我们用网云穿来做演示。内…

重启路由器可以换IP吗

想换IP有哪些方法可以实现&#xff1f;有时候IP被限制了&#xff0c;怎么换IP访问&#xff0c;重启路由器可以换IP吗&#xff1f;一般家庭的基于PPPOE拨号方式上网的,使用的是动态IP&#xff0c;可以更换IP&#xff0c;下面一起去看看如何重启路由器&#xff1a; 1、断电源重启…

矩阵切换器有哪些控制方式,有什么好处

矩阵切换器有哪些控制方式呢&#xff1f;矩阵切换器&#xff0c;可以使用网络控制&#xff0c;app控制&#xff0c;web等方式控制。 一、网络控制是指设备加一个网络模块使得在一个局域网内电脑进行控制。 二、app控制是指设备加一个app控制模块&#xff0c;使得手机&#xf…

vmware 静态ip上网 防止切换网络换ip

问题&#xff1a;因为电脑有的时候用公司wifi、手机热点、或家里的wifi进行上网。但要保证vmware虚拟机固定ip且能访问网络。 一、安装好虚拟后在菜单栏选择编辑→ 虚拟网络编辑器&#xff0c;打开虚拟网络编辑器对话框&#xff0c;选择Vmnet1 Net网络连接方式&#xff0c;随意…