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…

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;该函数将打印…

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

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

基于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…

下一代 Vue3 Devtools 正式开源

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

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) #…

克服大模型(LLM)部署障碍,全面理解LLM当前状态

近日&#xff0c;CMU Catalyst 团队推出了一篇关于高效 LLM 推理的综述&#xff0c;覆盖了 300 余篇相关论文&#xff0c;从 MLSys 的研究视角介绍了算法创新和系统优化两个方面的相关进展。 在人工智能&#xff08;AI&#xff09;的快速发展背景下&#xff0c;大语言模型&…

从文本文件或 csv 文件读取信息的示例

如下表格说明文本文件或 csv 文件中的信息如何在 WinCC (TIA Portal) 中显示。 IO 域用作于显示&#xff0c;只有最有一个条目被输出。 注意 在此例中由于最后一条条目被搜索&#xff0c;脚本的运行系统会随着文件的尺寸增长而增长。先前示例中的配置在该示例中不是必须的。但是…

手把手教你使用Django如何连接Mysql

目录 一、引言 二、准备工作 三、配置Django连接MySQL 1、安装MySQL驱动&#xff1a; 2、配置数据库设置&#xff1a; 3、 创建数据库迁移&#xff1a; 四、编写Django模型和视图函数 1、编写模型&#xff1a; 2. 编写视图函数&#xff1a; 3. 编写模板&#xff1a; …

开关电源如何覆铜

开关电源如何覆铜 开关电源覆铜是一个很重要的技术方法&#xff0c;如果没有很好的覆铜&#xff0c;就有可能会造成开关电源芯片的损坏。先介绍常见的开关电源电路&#xff1a; 图 1开关电源电路 从左到右分别是非同步整流Buck电路和同步整流Buck电路&#xff0c;第二排从左到…

MIinW-W64交叉编译找不到‘mutex‘问题解决

问题 在linux下安装mingw-w64来交叉编译Windows的程序和库. 就像我之前的一篇博客提到的来进行mingw的交叉编译 这样默认安装的线程模型是win32模型.这个线程模型不支持mutex. 一般查找问题的过程: 线程模型通常包含互斥锁&#xff08;mutex&#xff09;作为线程同步的基本工…

Arduino快速上手esp8266方案开发

认识ESP8266 ESP8266 是 Espressif Systems 生产的 Wi-Fi 片上系统 (SoC)。它非常适合物联网和家庭自动化项目&#xff0c;目前有非常高的市场普及率&#xff0c;还有更加高端的同时支持wifi和蓝牙的双核心芯片ESP32&#xff0c;可以在乐鑫官网查看完整的芯片列表。 ESP8266芯…

Keepalived双机热备

学会构建双机热备系统学会构建LVSHA高可用群集 1.1 Keepalived概述及安装 Keepalived的官方网站位于http://www.keepalived.org/&#xff0c;本章将以yum方式讲解Keepalived的安装、配置和使用过程。在非LVS群集环境中使用时&#xff0c;Keepalived也可以作为热备软件使用 1.…

解决PS“暂存盘已满”错误

问题&#xff1a;PS“暂存盘已满”错误 原因&#xff1a; PS在运行时会将文件的相关数据参数保存到暂存区。当提醒暂存盘满时&#xff0c;说明你当前PS运行的使用盘符空间不足&#xff0c;所以在运行时一定要保留有足够的盘符空间来运行PS。 效果图 解决方案 注意: 我们在使用P…