【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.pswp.cn/web/40761.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40761.shtml
英文地址,請注明出處:http://en.pswp.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.提取多個值時,默認值必填,否則讀不到變量