【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.mzph.cn/web/40761.shtml

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

相关文章

WY-35A4T三相电压继电器 导轨安装 约瑟JOSEF

功能简述 WY系列电压继电器是带延时功能的数字式交流电压继电器。 可用于发电机,变压器和输电线的继电保护装置中,作为过电压或欠电压闭锁的动作元件 LCD实时显示当前输入电压值 额定输入电压Un:100VAC、200VAC、400VAC产品满足电磁兼容四级标准 产品…

【Rust入门】猜数游戏

文章目录 前言Rust的变量Rust占位符读取一行数据到变量里面示例代码总结 前言 Rust是一种系统编程语言,它专注于速度、内存安全和并行性。学习Rust可以为你的编程技能库增添新的一笔。在这篇文章中,我们将通过一个简单的猜数游戏来介绍Rust的基本概念。…

VBA初学:零件成本统计之一(任务汇总)

经过前期一年多对金蝶K3生产任务流程和操作的改造和优化,现在总算可以将零件加工各个环节的成本进行归集了。 原本想写存储过程,通过直接SQL报表做到K3中去的,但财务原本就是用EXCEL,可以方便调整和保存,加上还有一部分…

便携式气象站:探索自然的智慧伙伴

在探索自然奥秘、追求科学真理的道路上,气象数据始终是我们不可或缺的指引。然而,传统的气象站往往庞大而笨重,难以在偏远地区或移动环境中灵活部署。 便携式气象站,顾名思义,是一种小巧轻便、易于携带和安装的气象观测…

模拟面试002-Java开发工程师+简历+问题+回答

模拟面试002-Java开发工程师简历问题回答 目录 模拟面试002-Java开发工程师简历问题回答面试简历面试官题问Java基础与编程框架与工具数据库与性能优化项目经验与实践团队合作与沟通 求职者回答Java基础与编程框架与工具数据库与性能优化项目经验与实践团队合作与沟通 参考资料…

由于找不到xinput1 3.dll无法继续执行重新安装程序

如果您的计算机提示无法找到xinput1_3.dll文件,这可能表明您的计算机存在问题。在这种情况下,您需要立即对xinput1_3.dll文件进行修复,否则您的某些程序将无法启动。以下是解决无法找到xinput1_3.dll文件的方法。 一、关于xinput1_3.dll文件的…

你要允许此应用对你的设备进行更改吗

在Windows 11中,当你看到提示“你要允许此应用对你的设备进行更改吗?”时,这是系统检测到某个应用或软件试图对你的设备进行更改或安装的提醒。这个提示是为了保护你的系统免受潜在恶意软件的侵害。如果你选择“是”,则应用可以继…

Elasticsearch 实现 Word、PDF,TXT 文件的全文内容提取与检索

文章目录 一、安装软件:1.通过docker安装好Es、kibana安装kibana:2.安装原文检索与分词插件:之后我们可以通过doc命令查看下载的镜像以及运行的状态:二、创建管道pipeline名称为attachment二、创建索引映射:用于存放上传文件的信息三、SpringBoot整合对于原文检索1、导入依赖…

安全及应用(更新)

一、账号安全 1.1系统帐号清理 #查看/sbin/nologin结尾的文件并统计 [rootrootlocalhost ~]# grep /sbin/nologin$ /etc/passwd |wc -l 40#查看apache登录的shell [rootrootlocalhost ~]# grep apache /etc/passwd apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin#改变…

Android增量更新----java版

一、背景 开发过程中,随着apk包越来越大,全量更新会使得耗时,同时浪费流量,为了节省时间,使用增量更新解决。网上很多文章都不是很清楚,没有手把手教学,使得很多初学者,摸不着头脑&a…

2011年的数字IC设计面经

2011年老罗写的面经,转眼间2024年了,大家凑合着看吧,可以顺便看看2011年的应届生薪资。 本人通信工程硕士,非电子科班出身,主要找数字IC设计的工作,找工作找了一个月左右,还算满意吧&#xff0…

边缘概率密度、条件概率密度、边缘分布函数、联合分布函数关系

目录 二维随机变量及其分布离散型随机变量连续型随机变量边缘分布边缘概率密度举例边缘概率密度 条件概率密度边缘概率密度与条件概率密度的区别边缘概率密度条件概率密度举个具体例子 参考资料 二维随机变量及其分布 离散型随机变量 把所有的概率,都理解成不同质量…

R迅速切换目录 -R语言002

实用小操作系列 R定位当前目录 getwd() [1] "/data/Rprofile1" #当前工作目录,因为他读取文件都是相对路径,进当前目录,一般不考虑绝对路径,写代码容易乱呀,切目录最简单完善 R切换工作目录 setwd(&q…

逻辑图框架图等结构图类图的高效制作方式不妨进来看看

**逻辑图框架图等结构图类图的高效制作方式不妨进来看看** 基于我们每天都在处理大量的数据和信息。为了更清晰地理解和传达这些信息,结构图、逻辑图和框架图等可视化工具变得越来越重要。然而,如何高效地制作这些图表并确保其准确性和易读性呢&#xf…

RedHat运维-LinuxSELinux基础4-端口绑定SELinux上下文

1. SELinux将一个_________与一个SELinux上下文相连接; 2. SSH协议将22/tcp端口与__________SELinux上下文相联系; 3. HTTP协议将80/tcp、443/tcp端口与____________SELinux上下文相联系; 4. 列出所有端口的SELinux上下文信息的方法是_______…

Mongodb索引简介

学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第84篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关…

Windows密码凭证获取

Windows HASH HASH简介 hash ,一般翻译做散列,或音译为哈希,所谓哈希,就是使用一种加密函数进行计算后的结果。这个 加密函数对一个任意长度的字符串数据进行一次数学加密函数运算,然后返回一个固定长度的字符串。…

常用字符集与乱码原因

1.ASCII字符集:仅对英文字符编码,每个字符用1B编码,7位二进制足以表示所有ASCII字符集,因此最高位始终为0 2.GBK字符集:GB2312字符集(简体中文字符集)BIG5字符集(台湾地区繁体中文字…

服装购物商城系统小程序-计算机毕业设计源码35058

摘要 服装购物商城系统小程序,依托Spring Boot框架的强大支持,为用户呈现了一个功能丰富、体验流畅的在线购物平台。该系统不仅涵盖了商品展示、用户注册登录、购物车管理、订单处理、支付集成等核心购物流程,还引入了个性化推荐算法&#xf…

Jmeter使用JSON Extractor提取多个变量

1.当正则不好使时,用json extractor 2.提取多个值时,默认值必填,否则读不到变量