From 9566ef07ffd1e193306256155214c4070277499b Mon Sep 17 00:00:00 2001 From: Floyd Date: Wed, 26 Jun 2024 18:34:32 +0800 Subject: [PATCH] =?UTF-8?q?post:=20Golang=20=E7=94=9F=E6=88=90=E8=A1=A8?= =?UTF-8?q?=E6=A0=BC=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\346\240\274\345\233\276\347\211\207.md" | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 "posts/2024/Golang \347\224\237\346\210\220\350\241\250\346\240\274\345\233\276\347\211\207.md" diff --git "a/posts/2024/Golang \347\224\237\346\210\220\350\241\250\346\240\274\345\233\276\347\211\207.md" "b/posts/2024/Golang \347\224\237\346\210\220\350\241\250\346\240\274\345\233\276\347\211\207.md" new file mode 100644 index 0000000..c1fc8c2 --- /dev/null +++ "b/posts/2024/Golang \347\224\237\346\210\220\350\241\250\346\240\274\345\233\276\347\211\207.md" @@ -0,0 +1,80 @@ +--- +title: Golang 生成表格图片 +slug: golang-table-image +created_at: 2024-06-26 17:27:00 +updated_at: 2024-06-26 17:27:00 +categories: + - 解决方案 + - 小文章 +tags: + - golang +--- + +## 需求 + +统计 gitlab 中各仓库的测试覆盖率,以表格的形式发送到企业微信群 + + + +## 问题 + +企业微信支持的 markdown 格式消息不支持表格解析,因此无法使用 markdown。不过有支持图片格式消息,所以可以将表格生成图片。 + +## 方案 + +[go-chart](https://github.com/wcharczuk/go-chart) 用的比较多,但它不支持表格。 + +这里有个基于 go-chart 的库 [go-charts](https://github.com/vicanso/go-charts) ,支持表格,试用下来效果还不错。 + +```go + +type covStruct struct { + projectId int + projectName string + projectCreator string + coverage string +} + +func drawTable(covs []covStruct) ([]byte, error) { + slices.SortFunc(covs, func(a, b covStruct) int { + return strings.Compare(a.projectCreator+a.projectName, b.projectCreator+b.projectName) + }) + header := []string{"项目 ID", "项目名称", "创建人", "测试覆盖率"} + data := lo.Map(covs, func(item covStruct, index int) []string { + var conv string + if item.coverage != "" { + conv = item.coverage + "%" + } else { + conv = "无" + } + return []string{strconv.Itoa(item.projectId), item.projectName, item.projectCreator, conv} + }) + spans := []int{1, 4, 2, 2} + + // 支持中文 + fontBs, _ := os.ReadFile("Noto Sans Mono CJKsc-VF.ttf") + _ = charts.InstallFont("noto", fontBs) + font, _ := charts.GetFont("noto") + charts.SetDefaultFont(font) + p, err := charts.TableOptionRender(charts.TableChartOption{ + Header: header, + Data: data, + Spans: spans, + Width: 1300, + }) + if err != nil { + return nil, err + } + return p.Bytes() +} +``` + +> 注意事项 +> +> 1. 中文支持需要单独下载字体文件并加载。参考:https://github.com/vicanso/go-charts/issues/57 +> 2. 宽度可在 `TableChartOption` 中设置,不过此时就需要调用 `charts.TableOptionRender` 函数,而不是例程中的 `charts.TableRender` + +将生成的 `[]byte` 写入文件后效果如下 + +![image-20240626182715573](https://static.zou8944.com/2024-06/294277fbb5f11f28fe90ab3ff471250f.png) +