vue导入导出excel、设置单元格文字颜色、背景色、合并单元格(使用xlsx-js-style库)
npm i xlsx-js-style
<template><button @click="download">下载 Excel 表格</button><el-table :data="tableData" style="width: 100%"><el-table-column prop="date" label="日期" width="180" /><el-table-column prop="name" label="Name" width="180" /><el-table-column prop="维生素A" label="维生素A" width="180" /><el-table-column prop="维生素D" label="维生素D" /><el-table-column prop="维生素E" label="维生素E" width="180" /><el-table-column prop="维生素B1" label="维生素B1" width="180" /><el-table-column prop="维生素B2" label="维生素B2" width="180" /><el-table-column prop="维生素B6" label="维生素B6" width="180" /></el-table>
</template>
<script setup>
import { reactive } from "vue";
import XLSX from "xlsx-js-style";const tableData = reactive([{name: "下限",维生素A: 500,维生素D: 6,维生素E: 10,维生素B1: 500,维生素B2: 800,维生素B6: 300,date: "/",},{name: "上限",维生素A: 1200,维生素D: 10,维生素E: 20,维生素B1: 1000,维生素B2: 1600,维生素B6: 600,date: "/",},{name: "Charlie",维生素A: 674,维生素D: 7.2,维生素E: 21,维生素B1: 798,维生素B2: 1200,维生素B6: 485,date: "2024.12.29",},{name: "Alice",维生素A: 690,维生素D: 8.1,维生素E: 18,维生素B1: 698,维生素B2: 1112,维生素B6: 674,date: "2024.12.29",},{name: "Bob",维生素A: 719,维生素D: 9,维生素E: 9.8,维生素B1: 498,维生素B2: 1342,维生素B6: 241,date: "2024.12.29",},{name: "Charlie",维生素A: 674,维生素D: 7.2,维生素E: 21,维生素B1: 798,维生素B2: 1200,维生素B6: 485,date: "2024.12.30",},{name: "Alice",维生素A: 690,维生素D: 8.1,维生素E: 18,维生素B1: 698,维生素B2: 1112,维生素B6: 674,date: "2024.12.30",},{name: "Bob",维生素A: 719,维生素D: 9,维生素E: 9.8,维生素B1: 498,维生素B2: 1342,维生素B6: 241,date: "2024.12.30",},{name: "Charlie",维生素A: 684,维生素D: 5.9,维生素E: 9,维生素B1: 478,维生素B2: 1462,维生素B6: 123,date: "2024.12.30",},
]);// 获取上下限
const lowerLimit = tableData[0];
const upperLimit = tableData[1];// 判断每列的值,超出范围时给相应单元格添加红色样式
const getFormattedData = () => {const formattedData = [];const merges = []; // 用于存储需要合并的单元格// 插入下限行并设置背景色为灰色const lowerLimitRow = { name: "下限" };for (const [key, value] of Object.entries(lowerLimit)) {if (key !== "name") {lowerLimitRow[key] = {v: value,s: {font: { color: { rgb: "000000" } },fill: { fgColor: { rgb: "D3D3D3" } }, // 设置背景色为灰色},};} else {lowerLimitRow[key] = {v: value,s: {font: { color: { rgb: "000000" } },fill: { fgColor: { rgb: "D3D3D3" } }, // 设置背景色为灰色},};}}formattedData.push(lowerLimitRow);// 插入上限行并设置背景色为灰色const upperLimitRow = { name: "上限" };for (const [key, value] of Object.entries(upperLimit)) {if (key !== "name") {upperLimitRow[key] = {v: value,s: {font: { color: { rgb: "000000" } },fill: { fgColor: { rgb: "D3D3D3" } }, // 设置背景色为灰色},};} else {upperLimitRow[key] = {v: value,s: {font: { color: { rgb: "000000" } },fill: { fgColor: { rgb: "D3D3D3" } }, // 设置背景色为灰色},};}}formattedData.push(upperLimitRow);let currentDate = "";let startRow = 2; // 从第三行开始(下限和上限已经插入)// 遍历表格数据for (let i = 2; i < tableData.length; i++) {const row = tableData[i];const formattedRow = { name: row.name };// 遍历每一列for (const [key, value] of Object.entries(row)) {if (key === "name" || key === "date") {formattedRow[key] = value;// 检查日期是否与上一行相同,若相同则合并单元格if (row.date === currentDate) {// 继续处理} else {if (currentDate !== "") {// 合并日期单元格merges.push({ s: { r: startRow, c: 0 }, e: { r: i, c: 0 } });}currentDate = row.date;startRow = i + 1;}continue;}// 获取下限和上限const lower = lowerLimit[key];const upper = upperLimit[key];// 判断是否超出范围let cellStyle = {};if (value < lower) {cellStyle = { font: { color: { rgb: "FF0000" } } }; // 红色字体} else if (value > upper) {cellStyle = { font: { color: { rgb: "FF0000" } } }; // 红色字体}// 将样式和数据一起保存formattedRow[key] = { v: value, s: cellStyle };}formattedData.push(formattedRow);}// 合并最后一个日期的单元格merges.push({s: { r: startRow, c: 0 },e: { r: tableData.length, c: 0 },});console.log("merges", merges);return { formattedData, merges };
};// 下载 Excel 文件
const download = () => {const { formattedData, merges } = getFormattedData();const reformattedData = formattedData.map((item) => {// 创建一个新的对象,确保 `date` 始终在最前面const { date, ...rest } = item;return { date, ...rest };});// 转换格式化后的表格数据为工作表const ws = XLSX.utils.json_to_sheet(reformattedData);// 添加合并单元格的逻辑ws["!merges"] = merges;// 创建一个新的工作簿并添加工作表const wb = XLSX.utils.book_new();XLSX.utils.book_append_sheet(wb, ws, "Sheet1");// 导出 Excel 文件XLSX.writeFile(wb, "example.xlsx");
};
</script>
相关文章:

vue导入导出excel、设置单元格文字颜色、背景色、合并单元格(使用xlsx-js-style库)
npm i xlsx-js-style <template><button click"download">下载 Excel 表格</button><el-table :data"tableData" style"width: 100%"><el-table-column prop"date" label"日期" width"180…...

电子电气架构 --- 中央处理器HPC及软件架构
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…...
代码实战:基于InvSR对视频进行超分辨率重建
Diffusion Models专栏文章汇总:入门与实战 前言:上一篇博客《使用Diffusion Models进行图像超分辩重建》中讲解了InvSR的原理,博主实测的效果是非常不错的,和PASD基本持平。这篇博客就讲解如何利用InvSR对视频进行超分辨率重建。 目录 环境准备 代码讲解 环境准备...

一文读懂主成分分析法(PCA)
主成分分析法(PCA) 主成分分析法(PCA)主成分分析的基本思想主成分的计算主成分分析的原理主成分分析的特点主成分分析的应用 主成分分析法(PCA) 主成分分析的基本思想 PCA是1901 年Pearson在研究回归分析…...
Redis(基础篇 + 实践篇 )
01 | 基本架构:一个键值数据库包含什么? Redis 作为一个内存数据存储系统,它的架构设计非常简洁,但功能非常强大。理解其核心架构对高效使用 Redis 至关重要。 客户端与服务器架构: 客户端通过 TCP 协议连接到 Redis …...
高质量C++小白教程:2.10-预处理器简介
当你在编译项目时,你可能希望编译器完全按照你编写的方式编译每一个代码文件,当事实并非如此。 相反,在编译之前,每一个.cpp文件都会经历一个预处理的阶段,在此阶段中,称为预处理器的程序对代码文件的文本进行各种更改. 预处理器实际上不会以任何方式修改原始代码文件,预处理…...

一、二极管(模电理论篇)
导论:PN结(结电容)是构成二极管,三极管,场效应管的原理基础 1.二极管特性(单向导电性) 1.1 P型半导体与N型半导体 在单晶体硅(原子核为正四价电子,可以形成四条共价键&…...

JAVA学习笔记_JVM
文章目录 初识jvm内存结构程序计数器(寄存器) 栈问题辨析内存溢出 线程诊断本地方法栈Heap堆内存溢出内存诊断 方法区内存溢出常量池 stringTable直接内存垃圾回收 初识jvm JRE JVM 基础类库 JDK JRE 编译工具 JavaSE JDK IDE工具 JavaEE JDK 应用服务器 IDE工具 jvm是…...
SQL 中复杂 CASE WHEN 嵌套逻辑优化
目标:优化复杂的 CASE WHEN 逻辑,提升 SQL 语句的可读性与执行效率,减少多层嵌套带来的复杂性。 1. CASE WHEN 的常见问题 嵌套过深:多个条件判断嵌套,难以阅读和维护。重复逻辑:相似逻辑在多个分支中重复…...

STM32-笔记34-4G遥控灯
4G接线 一、项目需求 服务器通过4G模块远程遥控开关灯。 二、项目实现 复制项目文件夹38-wifi控制风扇项目 重命名为39-4G遥控点灯 打开项目文件 加载文件 main.c #include "sys.h" #include "delay.h" #include "led.h" #include "ua…...

被催更了,2025元旦源码继续免费送
“时间从来不会停下,它只会匆匆流逝。抓住每一刻,我们才不会辜负自己。” 联系作者免费领💖源💖码。 三联支持:点赞👍收藏⭐️留言📝欢迎留言讨论 更多内容敬请期待。如有需要源码可以联系作者免…...

Java(day1)
注释 在Java中注释分为单行注释、多行注释还有文档注释 //我是单行注释/*我 是多行 注释 *//** 我是文档注释*/ 关键字 关键字:是被Java赋予了特定含义的英文单词 特点:关键字的字母都是c 在常用的代码编辑器中关键字都有特殊的高亮标记 在这个里…...

PDF文件提示-文档无法打印-的解决办法
背景信息 下载了几个签名的PDF文件,想要打印纸质版,结果打印时 Adobe Acrobat Reader 提示【文档无法打印】: 解决办法 网上的方案是使用老版本的PDF阅读器, 因为无法打印只是一个标识而已。 PDF文件不能打印的五种解决方案-zhihu 这些方…...

ubuntu操作系统安装SSH服务
1、更新仓库 sudo apt-get update 2、安装SSH服务 #安装SSH服务 apt-get install openssh-server#启用SSH服务 service ssh start#查看SSH服务运行状态 service ssh status 3、修改SSH配置文件 sudo vi /etc/ssh/sshd_config 4、开启ssh端口 sudo ufw allow ssh 5、重启SSH…...

Beamer-LaTeX学习(教程批注版)【1】
该文档总体由beamer-latex的教程而来,由耳东小白以自身学习路径整理。因其中要点基本按照教程的顺序和结构整理,故而不能称之为完全原创,但也不是翻译,更不是抄袭,是个人自学笔记和批注,其中添加了小白个人…...
IIS设置IP+端口号外网无法访问的解决方案
在IIS将站点设置为IP端口访问,假设端口为8080,设好后,服务器上可以访问,外网无法访问。 通常是端口8080没有加入【入站规则】的缘故,将8080端口加入【入站规则】即可,操作如下: 一、ctrlr 输入 …...
Markdown段落的空行缩进用法
Markdown段落的空行缩进用法。 前言语法详解●正文●段落●不分段换行●缩进 使用场景及实例小结其他文章快来试试吧🥰 Markdown段落,分割线的用法 👈点击这里也可查看 前言 段落由一句或多句连续的文本组成,通过一个或多个空行…...

[paddle] 非线性拟合问题的训练
利用paddlepaddle建立神经网络,模拟有限个数据的非线性拟合 本文仍然考虑 f ( x ) sin ( x ) x f(x)\frac{\sin(x)}{x} f(x)xsin(x) 函数在区间 [-10,10] 上固定数据的拟合。 import paddle import paddle.nn as nn import numpy as np import matplotlib.…...
每日一学——监控工具(Grafana)
2.2 Grafana 2.2.1 数据源配置 嘿,各位小伙伴们!既然我们已经有了Prometheus这位超级英雄来帮我们收集数据,那么接下来我们就需要一位艺术家来把这些枯燥的数据变成美丽的图画。这就是Grafana出场的时候了!Grafana是一款非常流行…...

FreshTomato 路由器固件常见配置以及踩坑记录
本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 在上一篇文章《网件 R6400 梅林固件恢复官方固件后刷入 FreshTomato》中,我将网件 R6400 刷入了 FreshTomato 固件,目前已经使用了大半个月了,稳定性比起 380.70_0-X7.9…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...

nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...

Mac flutter环境搭建
一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...