diff --git a/golang_learn/data_func/go_to_excel/go_to_style/main.go b/golang_learn/data_func/go_to_excel/demo01/main.go similarity index 100% rename from golang_learn/data_func/go_to_excel/go_to_style/main.go rename to golang_learn/data_func/go_to_excel/demo01/main.go diff --git a/golang_learn/data_func/go_to_excel/demo02/main.go b/golang_learn/data_func/go_to_excel/demo02/main.go new file mode 100644 index 0000000..f27570b --- /dev/null +++ b/golang_learn/data_func/go_to_excel/demo02/main.go @@ -0,0 +1,172 @@ +package main + +import ( + "fmt" + + "github.com/xuri/excelize/v2" +) + +func main() { + // wb := excelize.NewFile() + wb, err := excelize.OpenFile("../excel_files/TMP_05.xlsx") + if err != nil { + fmt.Println(err) + return + } + sheetName := wb.GetSheetName(wb.GetActiveSheetIndex()) + + styIdx, err := wb.NewStyle(&excelize.Style{ + Border: []excelize.Border{ + { + Type: "right", // top bottom left right diagonalDown diagonalUp 中的一个 + Color: "#000000", // 十六进制的颜色编码 + Style: 2, // 0-13 有对应的样式 + }, + { + Type: "left", + Color: "#000000", + Style: 2, + }, + { + Type: "top", + Color: "#000000", + Style: 2, + }, + { + Type: "bottom", + Color: "#000000", + Style: 2, + }, + }, Fill: excelize.Fill{ + Type: "gradient", // gradient 渐变色 pattern 填充图案 + // Pattern: 1, // 填充样式 当类型是 pattern 0-18 填充图案 1 实体填充 + // Color: []string{"#FF0000"}, // 当Type = pattern 时,只有一个 + Color: []string{"#00F700", "#00F700"}, + Shading: 1, // 类型是 gradient 使用 0-5 横向(每种颜色横向分布) 纵向 对角向上 对角向下 有外向内 由内向外 + }, Font: &excelize.Font{ + Bold: true, + // Italic: false, + // Underline: "single", + Size: 14, + Family: "宋体", + // Strike: true, // 删除线 + Color: "#0000FF", + }, Alignment: &excelize.Alignment{ + Horizontal: "center", // 水平对齐方式 center left right fill(填充) justify(两端对齐) centerContinuous(跨列居中) distributed(分散对齐) + Vertical: "center", // 垂直对齐方式 center top justify distributed + // Indent: 1, // 缩进 只要有值就变成了左对齐 + 缩进 + // TextRotation: 30, // 旋转 + // RelativeIndent: 10, // 好像没啥用 + // ReadingOrder: 0, // 不知道怎么设置 + // JustifyLastLine: true, // 两端分散对齐,只有 水平对齐 为 distributed 时 设置true 才有效 + // WrapText: true, // 自动换行 + // ShrinkToFit: true, // 缩小字体以填充单元格 + }, Protection: &excelize.Protection{ + Hidden: true, // 貌似没啥用 + Locked: true, // 貌似没啥用 + }, NumFmt: 0, // 内置的数字格式样式 0-638 常用的 0-58 配合lang使用,因为语言不同样式不同 具体的样式参照文档 + Lang: "zh-cn", // zh-cn 中文 + DecimalPlaces: 2, // 小数位数 只有NumFmt是 2-11 有效 + // CustomNumFmt: "",// 自定义样式 是指针,只能通过变量的方式 + NegRed: true, // 不知道具体的含义 + }) + if err != nil { + fmt.Println(err) + } + + if err := wb.SetCellStyle(sheetName, "A1", "B3", styIdx); err != nil { + fmt.Println(err) + return + } + + // 除了以Go语言的方式传参外,还支持JSON格式的传参 + // 边框样式 + borderSty, err := wb.NewStyle(`{"border":[ + {"type":"top","color":"#000000","style":1}, + {"type":"left","color":"#000000","style":1}, + {"type":"right","color":"#000000","style":1}, + {"type":"bottom","color":"#000000","style":1} + ]}`) + if err != nil { + fmt.Println(err) + } + + if err := wb.SetCellStyle(sheetName, "D2", "G10", borderSty); err != nil { + fmt.Println(err) + } + // 字体样式 + // 链接的字体样式 下划线 + 蓝色 + fontLinkSty, err := wb.NewStyle(`{"font":{"underline":"single","size":12,"color":"#0000FF","family":"仿宋"}}`) + if err != nil { + fmt.Println(err) + } + fmt.Println(fontLinkSty) + if err := wb.SetCellValue(sheetName, "F6", "这是链接"); err != nil { + fmt.Println(err) + } + + if err := wb.SetCellHyperLink(sheetName, "F6", "Sheet1!A1", "Location"); err != nil { + fmt.Println(err) + } + + if err := wb.SetCellStyle(sheetName, "F6", "F6", fontLinkSty); err != nil { + fmt.Println(err) + } + + styleIdx, err := wb.GetCellStyle(sheetName, "F6") + if err != nil { + fmt.Println(err) + } + + fmt.Println(styleIdx) + + // 对齐方式 + alStyle, err := wb.NewStyle(`{"alignment":{ + "horizontal":"center", + "vertical":"center" + }}`) + if err != nil { + fmt.Println(err) + } + if err := wb.SetCellStyle(sheetName, "F6", "F6", alStyle); err != nil { + fmt.Println(err) + } + + // 多个样式设置在同一个单元格,后面的会覆盖前面的 + + linkSty, err := wb.NewStyle(`{ + "border":[ + {"type":"top","color":"#000000","style":1}, + {"type":"left","color":"#000000","style":1}, + {"type":"right","color":"#000000","style":1}, + {"type":"bottom","color":"#000000","style":1} + ], + "font":{ + "underline":"single", + "size":12, + "color":"#0000FF", + "family":"仿宋" + }, + "alignment":{ + "horizontal":"center", + "vertical":"center" + } + }`) + + if err != nil { + fmt.Println(err) + } + if err := wb.SetCellStyle(sheetName, "D11", "D11", linkSty); err != nil { + fmt.Println(err) + } + + if err := wb.SetCellValue(sheetName, "D11", "这是链接"); err != nil { + fmt.Println(err) + } + + if err := wb.SetCellHyperLink(sheetName, "D11", "http://www.baidu.com", "External"); err != nil { + fmt.Println(err) + } + _ = wb.Save() + // wb.SaveAs("../excel_files/TMP_05.xlsx") +} diff --git a/golang_learn/data_func/go_to_excel/demo02/说明.md b/golang_learn/data_func/go_to_excel/demo02/说明.md new file mode 100644 index 0000000..cb701b2 --- /dev/null +++ b/golang_learn/data_func/go_to_excel/demo02/说明.md @@ -0,0 +1,120 @@ +## 设置样式 + +* 新建样式 +> func (f *File) NewStyle(style interface{}) (int, error) + +> 通过给定的样式格式 JSON 或结构体的指针创建样式并返回样式索引。请注意,颜色需要使用 RGB 色域代码表示。 + +* 设置样式 +> func (f *File) SetCellStyle(sheet, hcell, vcell string, styleID int) error + +* 样式结构体包含的设置项 +```go +type Style struct { + Border []Border `json:"border"` + Fill Fill `json:"fill"` + Font *Font `json:"font"` + Alignment *Alignment `json:"alignment"` + Protection *Protection `json:"protection"` + NumFmt int `json:"number_format"` + DecimalPlaces int `json:"decimal_places"` + CustomNumFmt *string `json:"custom_number_format"` + Lang string `json:"lang"` + NegRed bool `json:"negred"` +} +``` + +* 边框 +```go +type Border struct { + Type string `json:"type"` // top bottom left right diagonalDown diagonalUp + Color string `json:"color"` // 常用的颜色字符串 以及 十六进制的颜色编 red #F8F8F8 + Style int `json:"style"` // 见下表 样式可以去文档上看 +} +``` + +| 索引 | 线条样式 | 线宽 | +| ------ | ------ | ------ | +| 0 | 无 | 0 | +| 1 | 连续线 | 1 | +| 2 | 连续线 | 2 | +| 3 | 短线 | 1 | +| 4 | 点线 | 1 | +| 5 | 连续线 | 3 | +| 6 | 双线 | 3 | +| 7 | 连续线 | 0 | +| 8 | 短线 | 2 | +| 9 | 短线与点间隔线 | 1 | +| 10| 短线与点间隔线 | 2 | +| 11| 短线与两个点一组重复线 | 1 | +| 12| 短线与两个点一组重复线 | 2 | +| 13| 斜线与点线 | 2 | + +* 填充 +```go +type Fill struct { + Type string `json:"type"` // gradient pattern + Pattern int `json:"pattern"` + Color []string `json:"color"` + Shading int `json:"shading"` +} +``` +> 填充有两种类型 即 Type 有两种选择 gradient -> 渐变色 pattern -> 填充图案 +当Type是 gradient 时,Shading 可以选择 0-5 分别代表标横向(每种颜色横向分布),纵向,纵向 对角向上 对角向下 有外向内 由内向外;此时的Color 切片中的颜色可以有多个,Pattern 可以忽略 +当Type是 pattern 时,Pattern 可选 0-18 其中 1是实体填充 ;Color 切片中只要一种;Shading可以不填 +只有上述两种组合,其他的组合都不显示填充颜色 + +* 字体 +```go +type Font struct { + Bold bool `json:"bold"` // 是否加粗 + Italic bool `json:"italic"` // 是否倾斜 + Underline string `json:"underline"` // single double + Family string `json:"family"` // 字体样式 + Size float64 `json:"size"` // 字体大小 + Strike bool `json:"strike"` // 删除线 + Color string `json:"color"` // 字体颜色 +} +``` +> 注意字体是指针类型的 + +* 保护 +```go +type Protection struct { + Hidden bool `json:"hidden"` + Locked bool `json:"locked"` +} +``` + +* 对齐 +```go +type Alignment struct { + Horizontal string `json:"horizontal"` // 水平对齐方式 + Indent int `json:"indent"` // 缩进 只要设置了值,就变成了左对齐 + JustifyLastLine bool `json:"justify_last_line"` // 两端分散对齐,只有在水平对齐选择 distributed 时起作用 + ReadingOrder uint64 `json:"reading_order"` // 文字方向 不知道值范围和具体的含义 + RelativeIndent int `json:"relative_indent"` // 不知道具体的含义 + ShrinkToFit bool `json:"shrink_to_fit"` // 缩小字体填充 + TextRotation int `json:"text_rotation"` // 文本旋转 + Vertical string `json:"vertical"` // 垂直对齐 + WrapText bool `json:"wrap_text"` // 自动换行 +} +``` +> 对齐方式也是指针类型 + +> 多个样式设置在同一个单元格,后面的会覆盖前面的 +> +> 推荐使用JSON字符串的方式创建 + +```go +alStyle, err := wb.NewStyle(`{"alignment":{ + "horizontal":"center", + "vertical":"center" +}}`) +if err != nil { + fmt.Println(err) +} +if err := wb.SetCellStyle(sheetName, "F6", "F6", alStyle); err != nil { + fmt.Println(err) +} +``` \ No newline at end of file