vue实现导出+ 样式修改

 

1.安装插件

npm xlsx-style   ^0.18.5

npm install xlsx -S  ^0.8.13

2. 修改代码 node_modules里面找到  以下位置xlsx.js  搜索 write_ws_xml_data

替换成以下代码

function write_ws_xml_data(ws, opts, idx, wb) {var o = [], r = [], range = safe_decode_range(ws['!ref']), cell = "", ref, rr = "", cols = [], R = 0, C = 0, rows = ws['!rows'];var dense = Array.isArray(ws);var params = ({ r: rr }), row, height = -1;for (C = range.s.c; C <= range.e.c; ++C) cols[C] = encode_col(C);for (R = range.s.r; R <= range.e.r; ++R) {r = [];rr = encode_row(R);for (C = range.s.c; C <= range.e.c; ++C) {ref = cols[C] + rr;var _cell = dense ? (ws[R] || [])[C] : ws[ref];if (_cell === undefined) continue;if ((cell = write_ws_xml_cell(_cell, ref, ws, opts, idx, wb)) != null) r.push(cell);}if (r.length > 0 || (rows && rows[R])) {params = ({ r: rr });if (rows && rows[R]) {row = rows[R];if (row.hidden) params.hidden = 1;height = -1;if (row.hpx) height = px2pt(row.hpx);else if (row.hpt) height = row.hpt;if (height > -1) { params.ht = height; params.customHeight = 1; }if (row.level) { params.outlineLevel = row.level; }}o[o.length] = (writextag('row', r.join(""), params));}}if (rows) for (; R < rows.length; ++R) {if (rows && rows[R]) {params = ({ r: R + 1 });row = rows[R];if (row.hidden) params.hidden = 1;height = -1;if (row.hpx) height = px2pt(row.hpx);else if (row.hpt) height = row.hpt;if (height > -1) { params.ht = height; params.customHeight = 1; }if (row.level) { params.outlineLevel = row.level; }o[o.length] = (writextag('row', "", params));}}return o.join("");}

3.封装组件

import * as XLSX from "xlsx"
import XLSXStyle from "xlsx-style";
let _needSetStyles = []
let cols = []
let ifsubhead = false/*** 导出excel表格* @param {Array} tableData - 需要的出表格的数组* @param {Array} header - 表头* @param {Array} headerItem - 子表* @param {String} notice - 注意事项* @param {Array} needChangeColor - 需要修改颜色的属性* @param {Array} clo - 每一项的宽度* @param {Array} subhead - 副标题信息* @param {string} filename - 导出文件名称*/
export function exportData(tableData, header, headerItem, notice, needSetStyles = [], col = [], subhead = [], filename) {// 检查是否有需要修改颜色的属性_needSetStyles = needSetStyles.length > 0 ? needSetStyles : [];// 检查是否有指定每一列的宽度cols = col.length > 0 ? col : [];if (tableData.length > 0) {// 表头设置const aoa = [[notice]];console.log(tableData);if (subhead.length > 0) {aoa.push(subhead);ifsubhead = true}aoa.push(header);console.log(headerItem, 'headerItem');if (headerItem.length > 0) {headerItem.forEach(item => {aoa.push(item)})}// 创建 Excel 表格并设置样式const sheet = xlsxAddStyle(aoa, notice);// 导出文件openDownloadDialog(sheet2blob(sheet), `${filename}.xlsx`);} else {// 表格数据为空,可以进行相应的处理}}
export function openDownloadDialog(url, saveName) {let urlA;if (typeof url === "object" && url instanceof Blob) {urlA = URL.createObjectURL(url); // 创建blob地址}const aLink = document.createElement("a");aLink.href = urlA;// HTML5新增的属性,指定保存文件名,可以不要后缀,注意,file:///模式下不会生效aLink.download = saveName || "";let event;if (window.MouseEvent) event = new MouseEvent("click");else {event = document.createEvent("MouseEvents");event.initMouseEvent("click",true,false,window,0,0,0,0,0,false,false,false,false,0,null);}aLink.dispatchEvent(event);
}
// 将一个sheet转成最终的excel文件的blob对象,然后利用URL.createObjectURL下载
export function sheet2blob(sheet, sheetName) {var sheetNameS = sheetName || "sheet3";var workbook = {SheetNames: [sheetNameS],Sheets: {},};workbook.Sheets[sheetNameS] = sheet;workbook.Sheets['sheet100'] = sheet;// 生成excel的配置项var wopts = {bookType: "xlsx", // 要生成的文件类型bookSST: false, // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性type: "binary",};var wbout = XLSXStyle.write(workbook, wopts);// XLSXStyle.write(wb, { bookType: bookType, bookSST: false, type: 'binary' });var blob = new Blob([s2ab(wbout)], { type: "application/octet-stream" });// 字符串转ArrayBufferfunction 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;}return blob;
}
// 表格样式的设置
export function xlsxAddStyle(xlsx, filename) {// 创建工作簿// const workbook = XLSX.utils.book_new();const sheet = XLSX.utils.aoa_to_sheet(xlsx);console.log(sheet, 'sheet');const mergeArr = []; // 合并的单元格const rowH = []; // 表格每列高度// 单元格外侧有框线const borderAll = {top: { style: "thin" },bottom: { style: "thin" },left: { style: "thin" },right: { style: "thin" },};// 单元格外侧无框线const noBorder = {top: { style: "" },bottom: { style: "" },left: { style: "" },right: { style: "" },};for (const key in sheet) {if (Object.hasOwnProperty.call(sheet, key)) {const element = sheet[key];console.log(element, 'element');if (typeof element === "object") {const index = Number(key.slice(1)) - 1;rowH[index] = { hpt: 20, hpx: 20 };element.s = {alignment: {horizontal: "center", // 所有单元格右对齐vertical: "center", // 所有单元格垂直居中},font: {name: "宋体",sz: 10,italic: false,underline: false,},// border: borderAll,// fill: {//   fgColor: { rgb: "FFFFFFFF" },// },};// 指标值表格的样式if (key.indexOf("C") > -1) {element.s.alignment.horizontal = "center";}// 标题的样式if (index === 1) {element.s.font.bold = true;element.s.rows = { hpx: 150 }}// 如果传来副标题,那么之前设置的样式会被副标题顶替掉,需要重新设置样式if (ifsubhead) {if (index === 1) {element.s.font.bold = true;// 高rowH[1] = { hpt: 20, hpx: 20 }}if (index === 2) {element.s.font.bold = true;rowH[2] = { hpt: 30, hpx: 30 }}}// 处理合并单元格数组 s 开始 e 结束  c 列 r行if (element.v == filename) {mergeArr.push({s: { c: 0, r: 0 },e: { c: cols.length - 1, r: 0 },});rowH[0] = { hpt: 110, hpx: 110 }}if (element.v.includes('职业工种')) {mergeArr.push({s: { c: 0, r: 1 },e: { c: 1, r: 1 },});}}}}// 表头的样式设置sheet["A1"].s.alignment.horizontal = "left";// sheet["A1"].s.font.underline = true;sheet["A1"].s.font.sz = 11;sheet["A1"].s.font.color = { rgb: 'FFFFFF' }sheet["A1"].s.border = borderAllsheet['A1'].s.fill = { fgColor: { rgb: '217346' } }// 单元格的列宽sheet["!cols"] = cols// 设置行高sheet['!rows'] = rowH;// 自定义样式_needSetStyles.forEach(item => {sheet[item.name].s = item.style})sheet["!merges"] = mergeArr;return sheet
}

4.页面使用

<template><div><el-button type="success" @click="createTemplate">导出excel</el-button></div></template>
<script>
import {exportData} from '@/untils/exportData'  //上面组件的地址export default {methods: {createTemplate() {let templateList = [{examNumber:'物质名称1',name:'物质因子1'}]let header = ['物质名称', '物质因子', '时间']let subhead = ['不存在日校准的日期请对整列进行删除;请按实际校准数据时间修改日期和小时值,若时间列不够可自行增加列;缺失数据填充-999;请勿填充非数值内容;若模板中与实际监测因子个数不一致请联系平台管理人员'];let notice = [1、xxxxxxxxxxxxxxx;2、xxxxxxxxxxxxxxx;]let headerItem = templateList.map(item => {return [item.examNumber, item.name, '0']})const clos = [{ wpx: 210 }, { wpx: 210 }, { wpx: 420 }];// 字体样式const fontColorStyle = {name: "宋体",sz: 10,italic: false,underline: false,color: { rgb: 'FFFFFF' },};// 单元格外侧边框const borderStyle = {top: { style: "thin" },bottom: { style: "thin" },left: { style: "thin" },right: { style: "thin" },};const setStyles = [{name: 'A3',style: {font: fontColorStyle,fill: {fgColor: { rgb: 'FF4949' } // 设置背景颜色},alignment: {horizontal: "center", // 所有单元格右对齐vertical: "center", // 所有单元格垂直居中},border: borderStyle}},{name: 'B3',style: {font: fontColorStyle,fill: {fgColor: { rgb: 'FF4949' } // 设置背景颜色},alignment: {horizontal: "center", // 所有单元格右对齐vertical: "center", // 所有单元格垂直居中},border: borderStyle}},{name: 'C3',style: {font:fontColorStyle,fill: {fgColor: { rgb: 'FF4949' } // 设置背景颜色},alignment: {horizontal: "center", // 所有单元格右对齐vertical: "center", // 所有单元格垂直居中},border: borderStyle}}]exportData(templateList, header, headerItem, notice, setStyles, clos, subhead, '导出模板')},},
}
</script>

就导出成功啦

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

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

相关文章

搭建储能监控云平台:实现能源管理的智能化

搭建储能监控云平台&#xff1a;实现能源管理的智能化 在全球能源变革的大背景下&#xff0c;储能技术的重要性日益凸显。储能监控云平台作为能源管理的智能解决方案&#xff0c;可以为企业提供全方位的储能系统监控与数据分析&#xff0c;提高能源利用率&#xff0c;降低能源成…

QFN封装对国产双轴半自动划片机的性能有哪些要求?

1. 高精度切割&#xff1a;QFN封装要求芯片的尺寸和形状误差要尽可能小&#xff0c;因此对国产双轴半自动划片机的切割精度提出了高要求。高精度的切割能够提高封装的良品率和稳定性。 2. 快速和稳定&#xff1a;QFN封装生产需要快速、稳定的生产过程&#xff0c;因此对国产双轴…

Jenkins 插件下载速度慢、安装失败了!我教你怎么解决!

Jenkins部署完毕&#xff0c;如果不安装插件的话&#xff0c;那它就是一个光杆司令&#xff0c;啥事也做不了&#xff01; 所以首先要登陆管理员账号然后点击系统管理再点击右边的插件管理安装CI/CD必要插件。 但是问题来了&#xff0c;jenkins下载插件速度非常慢&#xff0c…

前端密钥怎么存储,以及临时存储一些数据,如何存储才最安全?

前端密钥存储安全的方案&#xff1a; 1、使用浏览器提供的本地存储&#xff1a;现代浏览器提供了本地存储机制&#xff0c;例如 Web Storage&#xff08;localStorage 和 sessionStorage&#xff09;或 IndexedDB。可以将密钥存储在这些本地存储中&#xff0c;并使用浏览器提供…

XTuner 大模型单卡低成本微调实战

XTuner 大模型单卡低成本微调实战 Finetune简介增量预训练微调指令跟随微调LoRA XTuner介绍功能亮点 8GB显存玩转LLMFlash AttentionDeepSpeed ZeRO 上手操作平台激活环境微调 参考教程&#xff1a;XTuner Finetune简介 LLM的下游应用任务中&#xff0c;增量预训练和指令跟随…

卓越协同,数字化运维:智能工单系统助力企业解决派单难题-亿发

不少企业的I运维部门在管理制度上存在架构混乱、分工不明、流程不透明等问题&#xff0c;导致部门内部和合作服务商之间的协作常常呈现出“踢皮球”的状态。因此&#xff0c;有效的企业运维协同管理显得尤为关键。然而&#xff0c;如果内部的协同流程设计不合理&#xff0c;过多…

软件测试|使用Python打印五子棋棋盘

简介 五子棋是我们传统的益智类游戏&#xff0c;在制作五子棋时&#xff0c;我们需要先将棋盘打印出来&#xff0c;本文就来介绍一下使用Python打印五子棋棋盘。 步骤一&#xff1a;打印空棋盘 首先&#xff0c;我们需要在Python中定义一个棋盘函数&#xff0c;该函数将打印…

Python语法进阶学习--进程和线程

后续很快就要进入Spark的学习&#xff0c;在学习之前也是要铺垫一个知识点&#xff1a;进程是什么&#xff1f;线程是什么&#xff1f;两者有什么区别&#xff1f;又有什么关系&#xff1f; 一. 并发与并行 并发&#xff1a;在一段时间内快速交替去执行多个任务&#xff08;多…

DHCP自动获取实验和DNS正向解析实验

一、服务程序 1.1DHCP定义 DHCP&#xff08;动态主机配置协议&#xff09;是一个局域网的网络协议。指的是由服务器控制一段IP地址范围&#xff0c;客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。默认情况下&#xff0c;DHCP作为Windows Server的一个服务组…

flex布局 子元素无限撑大元素问题解决

flex 布局下&#xff0c;使用flex&#xff1a;xx 的子项无限撑大容器 祖先容器使用flex布局&#xff0c;父容器使用flex&#xff1a;xx的时候&#xff0c;此时如果父容器下的子项使用宽高100%&#xff0c;子项将会无限撑大容器。 解决办法&#xff1a; 祖先容器使用flex定位时…

基于JavaWeb+BS架构+SpringBoot+Vue电影订票系统系统的设计和实现

基于JavaWebBS架构SpringBootVue电影订票系统系统的设计和实现 文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 文末获取源码 Lun文目录 1 绪 论 3 1.1研究背景和意义 3 1.2拟解决的问题及特性 3 1.3论文的结构 …

目标检测中的数据增强

整个代码参考:bubbliiiing/object-detection-augmentation。 random_data.py import cv2 import numpy as np from PIL import Image, ImageDrawdef rand(a=0, b=1):return np.random.rand()*(b-a) + adef get_random_data(annotation_line, input_shape, jitter=.3, hue=.1…

【蓝桥杯/DFS】路径之谜 (Java)

路径之谜小明冒充X星球的骑士&#xff0c;进入了一个奇怪的城堡。 城堡里边什么都没有&#xff0c;只有方形石头铺成的地面。假设城堡地面是 n x n 个方格。【如图1.png】所示。按习俗&#xff0c;骑士要从西北角走到东南角。 可以横向或纵向移动&#xff0c;但不能斜着走&…

vue本地运行开发,为什么要配置changeOrigin: true

changeOrigin: true是在配置反向代理时常见的一个选项&#xff0c;通常用于解决跨域请求的问题。Vue本地运行时&#xff0c;可能会涉及到前端应用与后端服务不在同一个域的情况&#xff0c;这就会触发浏览器的同源策略&#xff0c;阻止跨域请求。 使用Vue CLI&#xff08;或其…

下一代 Vue3 Devtools 正式开源

什么是 Vue DevTools Vue DevTools 是一个旨在增强 Vue 开发人员体验的工具,它提供了一些功能来帮助开发者更好地了解 Vue 应用程序。 Vue DevTools:Unleash Vue Developer Experience. Enhance your Vue development journey with an amazing experience! 典型的功能特征包…

50天精通Golang(第14天)

一、数据库 1.1 数据库 基本知识 DB&#xff1a; DBMS&#xff1a; 数据库&#xff0c;数据表&#xff0c;表的结构。。 DB&#xff1a;是指datebase&#xff08;数据库&#xff09; 数据库是存储数据的一个集合&#xff0c;数据库中通常使用数据表等组成&#xff0c;而数…

3d云渲染用什么显卡比较好?3d云渲染显卡推荐

3D云渲染能加快渲染速度&#xff0c;是众多公司的首选方案&#xff0c;作为公司负责人&#xff0c;选择哪个平台值得思考&#xff0c;今天我就说下我的选择吧。 首先我们要了解云渲染的渲染方式&#xff0c;云渲染的渲染方式分两种&#xff0c;一种是CPU渲染&#xff0c;一种是…

linux下编译ffmpeg 以及交叉编译并引入Android

linux下编译ffmpeg 下载: http://ffmpeg.org/download.html 支持mp3编码&#xff1a;ffmpeg自身只支持mp3的解码但是不支持mp3的编码&#xff0c;如果希望格式转换为mp3&#xff0c;我们可以先安装支持库lame:(使用时: ffmpeg -i audio.wav -acodec libmp3lame audio.mp3) #…

openssl3.2 - 官方demo学习 - keyexch - x25519.c

文章目录 openssl3.2 - 官方demo学习 - keyexch - x25519.c概述笔记END openssl3.2 - 官方demo学习 - keyexch - x25519.c 概述 官方程序中演示了私钥2种key交换的情况: 产生X25519的key对(私钥/公钥), 并交换公钥给对方, 并分别产生会话密钥, 使双方都能持有相同的会话密钥 …