vue项目前端实现将table导出成excel功能2

使用插件

xlsx、xlsx-style、file-saver
具体引入见文章:vue项目前端实现将table导出成excel功能1

方法一

exportExcelByData:将数据导出成excel,合并单元格需要另外设置

方法二

exportExcelByDom:将页面dom(el-table)导出成excel,页面有合并单元格,导出直接就合并了,但是有个瑕疵,如果导出的excel单元格有边框,有的情况下能看出来边框多加了一个单元格,如下图:
在这里插入图片描述
审查元素发现是因为el表头多了一个隐藏的th导致的,咱未找到解决办法,所以建议使用exportExcelByData来导出
在这里插入图片描述

新建ExcelUtil.js
import * as XLSX from 'xlsx';
import XLSXS from 'xlsx-style';
import FileSaver from 'file-saver';
function setExcelStyle(data, bgColorArr) {let borderAll = {//单元格外侧框线top: {style: "thin",},bottom: {style: "thin",},left: {style: "thin",},right: {style: "thin",},};//添加表头zuodata['!cols'] = [];for(let key in data) {if(data[key].constructor === Object) {data[key].s = {border: borderAll,  // 边框alignment: {horizontal: "center", //水平居中对齐vertical: "center", // 垂直居中wrapText: 1,// 换行indent: 0},font: {sz: 10,},bold: true,numFmt: 0};// 给指定单元格添加背景色if(bgColorArr&&bgColorArr.indexOf(key) !== -1) {data[key].s.fill = {fgColor: {"rgb": "e5f6fc"}}}// data["!cols"].push({ wpx: 180 }); // 单元格宽度}}
}
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
}export const exportExcelByData = (data, name = '导出表格', sheetName = 'Sheet1', bgColorArr, mergesArr = null ) => {//mergesArr 需要合并的单元格数据[{s: {r: 0, c: 0}, e: {r: 0, c: 11}}]// bgColorArr 需要添加背景色的单元格数据// data为二维数组时,导出一个sheet页// data为一个json对象,每个value值为一个二维数组,此时导出多个sheet页const wb = XLSX.utils.book_new();let ws = null;if(sheetName&&Array.isArray(sheetName)) {// 此时的data是以json对象形式传过来的,导出多个sheet页for(let key in data) {ws= XLSX.utils.aoa_to_sheet(data[key]);setExcelStyle(ws, bgColorArr);XLSX.utils.book_append_sheet(wb, ws, key+'年阈值表');}} else {// 导出一个sheet页ws= XLSX.utils.aoa_to_sheet(data);setExcelStyle(ws, bgColorArr);XLSX.utils.book_append_sheet(wb, ws, sheetName);}// 设置单元格合并if(mergesArr&&mergesArr.length > 0) {ws['!merges'] = mergesArr;}/* save to file */let wbout = XLSXS.write(wb, {bookType: 'xlsx',bookSST: false,type: 'binary'});// var wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: true, type: 'array' })try {FileSaver.saveAs(new Blob([s2ab(wbout)], { type: 'application/octet-stream' }), name + '.xlsx')} catch (e) { if (typeof console !== 'undefined') console.log(e, wbout) }// return wbout// XLSX.writeFile(wb, 'SheetJS.xlsx');// 设置导出Excel样式 这里主要是关注单元格宽度
};export const exportExcelByDom = (domId, name = '导出表格', sheetName = 'Sheet1') => {console.log(XLSX);/* generate workbook object from table */// 设置导出的内容是否只做解析,不进行格式转换     false:要解析, true:不解析const xlsxParam = { raw: true };var wb = XLSX.utils.table_to_book(document.querySelector('#'+domId), xlsxParam);/* get binary string as output */setExcelStyle(wb['Sheets'][sheetName], '一级');let wbout = XLSXS.write(wb, {bookType: 'xlsx',bookSST: false,type: 'binary'});try {FileSaver.saveAs(new Blob([s2ab(wbout)], { type: 'application/octet-stream' }), name + '.xlsx')} catch (e) { if (typeof console !== 'undefined') console.log(e, wbout) }return wbout
};
使用
  import { exportExcelByData } from '@/utils/ExcelUtil'// html<el-tableref="residualRiskTable"id="residualRiskTable"class="risk-assess-table":data="list"style="width: 100%"border:span-method="objectSpanMethod":header-cell-style="{background: '#DBE0F2',color: '#333333',padding: '12px 0','text-align': 'center',}"><el-table-columnv-for="(o, idx) in tableHeader":key="o.prop":label="o.name"align="center":prop="o.prop":width="o.width?o.width: ''"><template slot-scope="scope"><template v-if="o.isEdit"><el-input v-model="scope.row[o.prop]" size="small"></el-input><span class="hideNum">{{ scope.row[o.prop] }}</span></template><span v-else>{{ scope.row[o.prop] }}</span></template></el-table-column></el-table>data() {return {tableHeader: [{ name: '一级业务流程', prop: 'firstProcess', width: '' },{ name: '二级业务流程', prop: 'secondProcess', width: '' },{ name: '剩余风险等级', prop: 'currentResidualRiskLevel', width: '' },{ name: '剩余风险等级', prop: 'beforeFiResidualRiskLevel', width: '' },{ name: '剩余风险等级', prop: 'beforeSeResidualRiskLevel', width: '' },{ name: '剩余风险等级', prop: 'beforeThResidualRiskLevel', width: '' },{ name: '剩余风险等级', prop: 'beforeFoResidualRiskLevel', width: '' },{ name: '剩余风险等级', prop: 'beforeFiveResidualRiskLevel', width: '' },{ name: '近三年各单位审计覆盖率', prop: 'lastThreeAuditCov', width: '' },{ name: '2020年统计的覆盖率', prop: 'beforeThirdCov', width: '', isEdit: true },{ name: '2021年统计的覆盖率', prop: 'beforeSecondCov', width: '', isEdit: true },{ name: '2022年统计的覆盖率', prop: 'beforeFirstCov', width: '', isEdit: true }],list: [{taskId: 1,firstProcess: '1.战略规划管理流程',secondProcess: 5,currentResidualRiskLevel: 5,beforeFiResidualRiskLevel: 50,beforeSeResidualRiskLevel: 1,beforeThResidualRiskLevel: 4,beforeFoResidualRiskLevel: 2,beforeFiveResidualRiskLevel: 2,lastThreeAuditCov: 1,beforeThirdCov: 1,beforeSecondCov: 3,beforeFirstCov: 4,}.......],exportData: [],spanArr: []// 合并单元格用到的}},mounted() {this.filterData(this.list);},methods: {// 格式化数据为可导出的格式formatterData() {// 根据自己的数据,拼出this.exportData,this.exportData是个二维数组let header = [];let title = ['二业务流程剩余风险水平', '', '', '', '', '', '', '', '', '', '', ''];// title为导出时给excel添加的标题,原页面中是没有的let keysArr = [];this.tableHeader.forEach(item => {header.push(item.name);keysArr.push(item.prop);});this.exportData = [title, header];this.list.forEach(item => {let arr = [];keysArr.forEach(o => {arr.push(item[o]);});this.exportData.push(arr)});},exportExcelByDataFn() {this.formatterData();let mergesArr = [{s: {r: 0, c: 0}, e: {r: 0, c: 11}}];let bgColorArr = ['A1', 'A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2', 'K2', 'L2'];exportExcelByData(this.exportData, '剩余风险水平表', '剩余风险水平表', bgColorArr, mergesArr)},objectSpanMethod({ row, column, rowIndex, columnIndex }) {if (columnIndex === 0) {if(this.spanArr[rowIndex]){return {rowspan: this.spanArr[rowIndex],colspan: 1}}else{return {rowspan: 0,colspan: 0}}}else {return {rowspan: 1,colspan: 1}}},filterData(data) {let contactDot = 0;let spanArr = [];data.forEach((item, index) => {if (index === 0) {spanArr.push(1)} else {//注释:firstProcess  是对应体系,data 对应table绑定的数据源if (item.firstProcess === data[index - 1].firstProcess) {spanArr[contactDot] += 1;spanArr.push(0)} else {contactDot = index;spanArr.push(1)}}})this.spanArr = spanArr;},
}

exportData数据格式如下:
在这里插入图片描述

导出结果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/394940.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

媒体资讯视频数据采集-yt-dlp-python实际使用-下载视频

对于视频二创等一些业务场景&#xff0c;可能要采集youtube等的相关媒体视频资源&#xff0c;使用[yt-dlp](https://github.com/yt-dlp/yt-dlp)是一个不错的选择&#xff0c;提供的命令比较丰富&#xff0c;场景比较全面yt-dlp 是一个用 Python 编写的命令行工具&#xff0c;主…

Linux部署python3.0版本——及基本操作

&#xff08;一&#xff09;部署环境 首先查看列表&#xff0c;找到python3.0的包 yum list installed|grep python 如果没有&#xff0c;是因为yum源的问题&#xff0c;可部署阿里云镜像然后下载epel包&#xff0c;这里的内容可参考前面的阿里云镜像部署 然后进行下载 yum…

React 用户点击某个元素后只执行一次操作

React开发中经常会遇到需求&#xff1a;用户点击某个元素后只执行一次特定操作。比如&#xff0c;用户点击按钮后弹出提示框&#xff0c;但希望再次点击按钮不再触发提示框。针对这种需求&#xff0c;可以封装一个自定义Hooks来实现只允许点击一次的功能。 import {useCallbac…

Mysql,用户名重复,无法调用问题

问题描述&#xff1a; 我电脑的数据库用户名是&#xff0c;root。 因为经常需要帮别人封装程序&#xff0c;所以需要在我本机跑通别人的程序。有的程序里面也涉及到数据库&#xff0c;用户名也是&#xff0c;root&#xff0c;但是密码与我本机的不同。 之前我会修改我用户名…

MySQL —— 表的设计

表的设计 在设计表之前&#xff0c;我们需要从需求中获得实体&#xff08;实体就是一张张表&#xff09;&#xff0c;实体的属性就是表中的字段&#xff08;列&#xff09;&#xff0c;然后确定实体与实体之间的关系&#xff0c;最后使用 SQL 语句去创建具体的表 在设计表的时…

Unity Console 窗口输出对齐

起因&#xff1a;做了个工具在console窗口罗列一些信息&#xff0c;基本结构是 [ 文件名 &#xff1a;行号 ]&#xff0c;因为文件&#xff0c;行号长度不一&#xff0c;想要做到如下效果。 初步尝试&#xff0c;用以下方法&#xff1a; string format "{0,-10} …

python自动化笔记:配置文件.ini及yml文件

目录 一、.ini配置文件1.1、ini编写格式1.2、读取.ini配置文件的数据1.3、编辑&#xff1a;写入和删除&#xff08;了解即可&#xff09; 二、yaml文件2.1、yaml编写语法规则2.2、yaml三种数据结构2.3、yaml文件的读取和写入 一、.ini配置文件 后缀名.ini 用于存储项目全局配置…

[独家原创] CPO-RBF多特征分类预测 优化宽度+中心值+连接权值 (多输入单输出)Matlab代码

[独家原创] CPO-RBF多特征分类预测 优化宽度中心值连接权值 &#xff08;多输入单输出&#xff09;Matlab代码 目录 [独家原创] CPO-RBF多特征分类预测 优化宽度中心值连接权值 &#xff08;多输入单输出&#xff09;Matlab代码效果一览基本介绍程序设计参考资料 效果一览 基本…

java学习day016

API 1.Number 数字格式化 : # 任意数字&#xff0c;0-9任意单个数字 , 千分位 . 小数点 0 补位 //四位小数 DecimalFormat df new DecimalFormat("###,###.####"); System.out.println(df.format(1234567.312));//1,234,567.312 //四位小数,不够补0 df new Deci…

前缀和处理数组区间之和问题

1.什么是区间和问题 “区间和问题”通常指的是涉及计算或处理数组或数列某个子区间&#xff08;即一段连续元素&#xff09;的总和的类型问题。这类问题可能有多种变体和不同的复杂度&#xff0c;但基本思想都是在给定的区间内快速计算总和或处理与区间和相关的操作。 2.例题…

常见的框架漏洞

ThinkPHP 首先我们打开一个环境 然后进行远程命令执行代码 然后进行远程代码执行 ?sindex/think\app/invokefunction&functioncall_user_func_array&vars[0]phpinfo&vars[1][]-1 在网页中输出phpinfo getshell ?sindex/think\app/invokefunction&function…

c语言基础知识

ASCII码 字符A~Z的ASCII码值从65~90 • 字符a~z的ASCII码值从97~122 • 对应的⼤⼩写字符(a和A)的ASCII码值的差值是32 • 数字字符0~9的ASCII码值从48~57 • 换⾏ \n 的ASCII值是&#xff1a;10 • 在这些字符中ASCII码值从0~31这32个字符是不可打印字符&#xff0c;⽆法打印在…

sql实战cmseasy

环境搭建 这里我们用phpstady搭建 版本是cmseasy5.5 未授权访问 这里ip的方法获取客户端的ip 这里的意思是当你的server ip等于 客户端ip并且get传参 get(ishtml)1的情况下他会直接return 他就不会检查后面是不是admin&#xff0c;而他这个IP是从X_FORWARDED_FOR获取&…

Spring Boot 3.x Rest API统一异常处理最佳实践

上一篇&#xff1a;Spring Boot 3.x Rest API最佳实践之统一响应结构 在Spring MVC应用中&#xff0c;要对web表示层所抛出的异常进行捕获处理有多种方式&#xff0c;具体的可参考著名国外Spring技术实战网站baeldung上的相关话题。Spring Boot对Spring MVC应用中抛出的异常以…

RNN循环网络层

文章目录 1、简介2、RNN 网络原理3、PyTorch RNN 层的使用3.1、RNN送入单个数据3.2、RNN层送入批量数据 4、RNN三个维度4.1、解释4.2、输入数据的组织4.3、示例4.4、为什么需要这种格式&#xff1f;4.5、小结 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&a…

苹果手机数据被抹除还能恢复吗?这两个方法强烈推荐

苹果手机数据被抹除还能恢复吗&#xff1f;我们在使用苹果手机时&#xff0c;有时由于误操作、系统故障或升级失败等原因&#xff0c;导致手机照片、备忘录、视频、联系人等数据被意外抹除。 面对这类情况&#xff0c;我们应该怎么办&#xff1f;下面牛小编给大家的分享2个方法…

记录使用FlinkSql进行实时工作流开发

使用FlinkSql进行实时工作流开发 引言Flink SQL实战常用的Connector1. MySQL-CDC 连接器配置2. Kafka 连接器配置3. JDBC 连接器配置4. RabbitMQ 连接器配置5. REST Lookup 连接器配置6. HDFS 连接器配置 FlinkSql数据类型1. 基本数据类型2. 字符串数据类型3. 日期和时间数据类…

论文解读,神经网络全梯度表示《Full-Gradient Representation for Neural Network Visualization》

导语 这篇论文介绍了一种新的工具&#xff0c;称为全梯度&#xff0c;用于解释神经网络的响应。这个全梯度的概念将神经网络的响应分解为两个部分&#xff1a;输入灵敏度和每个神经元的灵敏度分量。 输入灵敏度&#xff1a;输入灵敏度指的是对于神经网络输出的影响程度。它反…

Python试讲

Python试讲 导语Python简介Python及其特点如何使用Python Python与计算计算变量 导语 本次试讲内容如下&#xff1a;Python简介与使用&#xff0c;Python与基本运算 辅助教材为 《趣学Python编程》和《Python编程从入门到实践》 Python简介 Python是目前入门最简单最好学的…

NSSCTF练习记录:[SWPUCTF 2021 新生赛]jicao

题目&#xff1a; 这段PHP代码的意思是&#xff1a; 对index.php文件进行语法高亮显示&#xff0c;插入flag.php文件&#xff0c;变量id的值为POST传递的值&#xff0c;变量json的值为GET传递的json类型的值。当id值为wllmNB且json中含有键为“x”&#xff0c;值为“wllm”的时…