【Go】excelize库实现excel导入导出封装(四),导出时自定义某一列或多列的单元格样式

大家好,这里是符华~

查看前三篇:

【Go】excelize库实现excel导入导出封装(一),自定义导出样式、隔行背景色、自适应行高、动态导出指定列、动态更改表头

【Go】excelize库实现excel导入导出封装(二),基于map、多个sheet、多级表头、树形结构表头导出,横向、纵向合并单元格导出

【Go】excelize库实现excel导入导出封装(三),基于excel模板导出excel

背景

前两篇文章中,导出时的样式都有设置统一的基础样式的。但是有些时候,我们需要对特定的某一列或某几列设置单独的样式。比如某一列单元格的值都是数值类型,我们需要让这一列右对齐,其它列不变(基础样式是居中对齐);又或者是把某一列文字标红或背景色填充为红色,其它列不变(保持基础样式)。

这篇文章就是来实现:在基础样式的基础上,对特定的列设置单独的自定义样式,且这些特定的列每列都可以设置单独的样式。

实现

修改 tag

因为我们是对一整列设置样式,因此我们可以直接将自定义的样式,放在需要设置样式的那个字段的tag里面。

如下图:

在这里插入图片描述

我们解析excel这个tag的时候,是通过正则表达式来解析的,因此在之前的正则表达式基础上,需要再加上style的解析:

在这里插入图片描述

同时对应的tag结构体,也需要再加上Style属性:

在这里插入图片描述

然后根据正则表达式解析tag值时,将解析到的style值设置到tag结构体的Style属性中:

在这里插入图片描述

在这里插入图片描述

设置

tag和tag解析部分修改完后,我们需要考虑下在tag里面添加样式的时候,我们应该按什么格式来设置,到后面解析这些样式的时候更方便。

然后我目前想到的设置格式是这样的:

在这里插入图片描述

样式类名和样式名,对应excelize库下的xmlStyles.go里面的Style结构体里的属性名:

在这里插入图片描述

在这里插入图片描述

样式类名是必须的,这样方便我们判断这个样式是属于哪个样式类(对应的结构体)的,然后将Alignment{Horizontal:left},Font{Color:#ff0000,Size:16.0,Family:黑体},Fill{Color:#f9cb9c,Type:pattern,Pattern:1} 这一段字符串根据样式类名分隔,分隔后处理成 json 字符串,再转成对应的样式类结构体。

代码如下:

// customStyle就是 Alignment{Horizontal:left},Font{Color:#ff0000,Size:16.0,Family:黑体},Fill{Color:#f9cb9c,Type:pattern,Pattern:1} 这一串字符
// 设置自定义样式:customStyle 定义的样式、 baseStyle 基础样式
func (e *Excel) SetCustomCellStyle(customStyle string, baseStyle int) int {style, _ := e.F.GetStyle(baseStyle)if style == nil {style = &excelize.Style{}}patt := ".*?{.*?}" // 使用正则解析每一个样式类和它的大括号里面包含的样式re := regexp.MustCompile(patt)matches := re.FindAllStringSubmatch(customStyle, -1)for i := range matches {s := matches[i][0]if strings.HasPrefix(s, ",") {s = strings.TrimPrefix(s, ",")}s = strings.ReplaceAll(s, "{", "")s = strings.ReplaceAll(s, "}", "")if strings.HasPrefix(s, "Alignment") { // 对齐样式result := stringBuilder("Alignment", s) // 处理成json字符串json.Unmarshal([]byte(result), &style.Alignment) // 将json字符串转成对应的结构体} else if strings.HasPrefix(s, "Font") { // 字体样式result := stringBuilder("Font", s)json.Unmarshal([]byte(result), &style.Font)} else if strings.HasPrefix(s, "Fill") { // 背景填充样式result := stringBuilder("Fill", s)json.Unmarshal([]byte(result), &style.Fill)}}i, _ := e.F.NewStyle(style)return i
}// 字符串处理拼接(处理成结构体json字符串)replaceStr 需要替换的字符
func stringBuilder(replaceStr, str string) string {var builder strings.Builderbuilder.WriteString("{")str = strings.ReplaceAll(str, replaceStr, "")split := strings.Split(str, ",")for v := range split {split1 := strings.Split(split[v], ":")if v > 0 {builder.WriteString(",")}builder.WriteString("\"")builder.WriteString(split1[0])builder.WriteString("\"")// 如果是数值或bool类型,不需要拼接引号if IsNumeric(split1[1]) || IsBool(split1[1]) {builder.WriteString(":")builder.WriteString(split1[1])} else {// 因为Fill下面的Color属性是字符串数组的,因此需要拼接中括号if replaceStr == "Fill" && split1[0] == "Color" {builder.WriteString(":[\"")builder.WriteString(split1[1])builder.WriteString("\"]")} else {// 字符串需要拼接引号builder.WriteString(":\"")builder.WriteString(split1[1])builder.WriteString("\"")}}}builder.WriteString("}")return builder.String()
}// 是否是数字:包含正负整数和正负小数
func IsNumeric(s string) bool {// 正则表达式匹配整数和小数b, _ := regexp.MatchString(`^-?\d+(\.\d+)?$`, s)return b
}// 是否是bool值
func IsBool(s string) bool {return strings.EqualFold(s, "true") || strings.EqualFold(s, "false")
}

样式解析并且设置完成后,在导出excel时,将在tag里设置了的样式,应用到对应的列中。因此我们还需要对构建数据行的代码进行修改:

在这里插入图片描述

在这里插入图片描述

测试

在这里插入图片描述

效果图:

在这里插入图片描述

最后

完整代码:点这里

ok以上就是今天的全部内容了,大家看完顺便给我点个Star、加关注呗~🥰🥳

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

AI Earth应用—— 在线使用sentinel数据VV和VH波段进行水体提取分析(昆明抚仙湖、滇池为例)

AI Earth 本文的主要目的就是对水体进行提取,这里,具体的操作步骤很简单基本上是通过,首页的数据检索,选择需要研究的区域,然后选择工具箱种的水体提取分析即可,剩下的就交给阿里云去处理,结果如下: 这是我所选取的一景影像: 详情 卫星: Sentinel-1 级别: 1 …

新产品或敏捷项目过程 SOP,附带流程图及流程规范

一、项目启动 项目背景和目标明确 市场调研结果分析,确定新产品的需求和市场机会。制定明确的项目目标,包括产品特性、上市时间、预期收益等。 组建项目团队 确定项目经理、产品经理、开发人员、测试人员、市场人员等角色。明确各成员的职责和权限。 项目…

Java语言程序设计基础篇(第10版)编程练习题13.18(使用 Rational 类)

第十三章第十八题(使用 Rational 类) 题目要求: 编写程序,使用 Rational 类计算下面的求和数列: 你将会发现输出是不正确的 ,因为整数溢出(太大了)。为了解决这个问题 ,参见编程练习題13.15。代码参考: package cha…

蜂窝物联农业气象站,守护丰收每一步

现代农业的革新者——农业自动气象站,正以其多功能的传感器、高效的数据采集传输系统、智能的数据云平台以及可靠的供电供网系统,成为农业生产中的得力助手。这些传感器能够实时监测温度、湿度、风速、风向、气压、土壤温度、土壤湿度、土壤PH值、土壤盐…

CorelDRAW2024新版本来咯!你的设计神助手

🎉 设计界的朋友们,注意啦!你们的新宠——CorelDRAW 2024 来咯! 🌟 一、设计神器再进化 亲爱的设计小伙伴们,有没有感觉每天与那些不配合的软件战斗,像是在打怪升级?🐉 …

Selenium的这些自动化测试技巧你知道几个?

Selenium自动化测试技巧 与以前瀑布式开发模式不同,现在软件测试人员具有使用自动化工具执行测试用例套件的优势,而以前,测试人员习惯于通过测试脚本执行来完成测试。 但自动化测试的目的不是完全摆脱手动测试,而是最大程度地减少…

js的作用域链

function test(){} 运行期上下文:当函数执行时,会创建一个称为执行期上下文的内部对象。一个执行期上下文定义了一个函数执行时的环境,函数每次执行时对应的执行上下文都是 独一无二的,所以多次调用一个函数对导致创建多个执行上下…

leetcode力扣_排序问题

215.数组中的第K个最大元素 鉴于已经将之前学的排序算法忘得差不多了,只会一个冒泡排序法了,就写了一个冒牌排序法,将给的数组按照降序排列,然后取nums[k-1]就是题目要求的,但是提交之后对于有的示例显示”超出时间限制…

谷粒商城学习笔记-12-开发工具环境安装配置

文章目录 一,JDK的安装1.进入官网下载2,jdk安装3,Java环境验证 二,Idea安装插件1,lombok2,MybatisX 三,Maven的下载与配置1,下载Maven2,Idea配置Maven3,maven…

ESP32CAM物联网教学05

ESP32CAM物联网教学05 超级监控摄像头 点灯科技APP还能查看摄像头的视频呢!这样,小智的物联网小车就变身成为超级监控摄像头啦。 测试摄像头视频图像 我们把前面的物联网小车的程序稍作修改,增加了摄像头的程序,去掉了按键组件程…

RocketMQ-订阅一致及解决方案

背景 这里借用Rocketmq官方的一句话来描述订阅关系一致: 订阅关系一致指的是同一个消费者分组Group ID下,所有Consumer实例所订阅的Topic和Tag必须完全一致。如果订阅关系不一致,可能导致消息消费逻辑混乱,消息被重复消费或遗漏。 具体的问题…

关于GIS的概念方面在前端编程中的理解

关于GIS的概念方面在前端编程中的理解 一. 什么是gis二. 关于地球的建模(了解)三. GIS坐标系表现形式四.GIS的数据4.1 矢量数据4.2 栅格数据4.3 矢量数据和栅格数据的不同 一. 什么是gis 地理坐标系统,其目的就是通过地理坐标系可以确定地球上任何一点的位置。 二. …

jenkins配置gitee源码地址连接不上

报错信息如下: 网上找了好多都没说具体原因,最后还是看jenkins控制台输出日志发现: ssh命令执行失败(git环境有问题,可能插件没安装成功等其他问题) 后面发现是jenkins配置git的地方git安装路径错了。新手…

215. 数组中的第K个最大元素(中等)

215. 数组中的第K个最大元素 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转:215. 数组中的第K个最大元素 2.详细题解 快速排序算法在每一轮排序中,随机选择一个数字 x x x,根据与 x x x的大小关系将要排序的数…

设计小能手必备!CorelDRAW2024新功能大揭秘

🎉 设计小能手必备!CorelDRAW 2024新功能大揭秘 嗨,亲爱的小红书的朋友们~👋 今天我要和大家安利一款让设计师们疯狂打call的设计软件——CorelDRAW 2024!🌟 作为一名资深的设计师,我…

VBA初学:零件成本统计之三(获取材料外协的金额)

第三步,从K3的数据库中获取金额 我这里是使用循环,通过任务单号将金额汇总出来,如果使用数组的话,还要按任务单写GROUP,还要去对应,不如循环直接一点 获取材料和外协金额的表格Sub getje()Dim rowcount A…

ctfshow-web入门-文件包含(web88、web116、web117)

目录 1、web88 2、web116 3、web117 1、web88 没有过滤冒号 : ,可以使用 data 协议,但是过滤了括号和等号,因此需要编码绕过一下。 这里有点问题,我 (ls) 后加上分号发现不行,可能是编码结果有加号,题目…

Qwen1.5-1.8b部署

仿照ChatGLM3部署,参考了Qwen模型的文档,模型地址https://modelscope.cn/models/qwen/Qwen1.5-1.8B-Chat/summary http接口 服务端代码api.py from fastapi import FastAPI, Request from transformers import AutoTokenizer, AutoModelForCausalLM, …

Docker:Docker网络

Docker Network 是 Docker 平台中的一项功能,允许容器相互通信以及与外界通信。它提供了一种在 Docker 环境中创建和管理虚拟网络的方法。Docker 网络使容器能够连接到一个或多个网络,从而使它们能够安全地共享信息和资源。 预备知识 推荐先看视频先有…

多功能实用工具箱,实用工具箱提供了从日常,图片,查询、设备、特色、提取等多方面的功能,操作简单,即点即用,避免您下载超多应用的难题,应用体积轻巧,界面简洁。

今天给大家分享手机工具软件合集,明天想看什么软件,在评论区留言吧! 软件链接:4款万能玩机工具,一网打尽,快来看看! 实用工具箱 这是一款多功能实用工具箱,实用工具箱提供了从日常…