# go语言操作excel ## 简介 excelize包提供了一组函数,允许您对XLSX / XLSM / XLTM文件进行写入和读取。支持读取和写入由Microsoft Excel™2007和更高版本生成的电子表格文档。高兼容性支持复杂组件,并提供流API,用于从包含大量数据的工作表中生成或读取数据。这个库需要Go版本1.15或更高版本。 [更多信息](https://xuri.me/excelize) ## 快速上手 ### 安装 安装命令 ``` go get github.com/xuri/excelize/v2 ``` ### 更新 更新命令 ``` go get -u github.com/xuri/excelize/v2 ``` ### 创建excel文档 ``` package main import ( "fmt" "github.com/360EntSecGroup-Skylar/excelize/v2" ) func main() { f := excelize.NewFile() //创建一个工作表 index := f.NewSheet("Sheet2") //更改sheet1名字 f.SetSheetName("Sheet1","test") //设置单元格的值 f.SetCellValue("Sheet2","A2","Hello world!") f.SetCellValue("test","B1",100) //设置工作簿的默认工作表 f.SetActiveSheet(index) //根据指定路径保存文件 err := f.SaveAs("./Book1.xlsx") if err != nil{ fmt.Println(err) } } ``` ### 读取Excel文档 ``` package main import ( "fmt" "github.com/360EntSecGroup-Skylar/excelize/v2" ) func main() { //打开Excel f ,err := excelize.OpenFile("./Book1.xlsx") if err != nil{ fmt.Println(err.Error()) return } //获取工作表中指定单元格的值 cell ,err := f.GetCellValue("test","B1") if err != nil{ fmt.Println(err.Error()) return } fmt.Println(cell) //获取Sheet2上所有单元格 rows,err := f.GetRows("Sheet2") for _,row := range rows{ for _,colCell := range row{ fmt.Print(colCell,"\t") } fmt.Println() } } ``` ### 在Excel文档中创建图标 使用 Excelize 生成图表十分简单,仅需几行代码。您可以根据工作表中的已有数据构建图表,或向工作表中添加数据并创建图表。 ``` package main import ( "fmt" "github.com/360EntSecGroup-Skylar/excelize/v2" ) func main() { categories := map[string]string{ "A2":"Small", "A3":"Normal", "A4":"Large", "B1":"Apple", "C1":"Orange", "D1":"Pear", } values := map[string]int{"B2":2,"C2":3,"D2":3,"B3":5,"C3":2,"D3":4,"B4":6,"C4":7,"D4":8} f := excelize.NewFile() for k,v := range categories{ f.SetCellValue("Sheet1",k,v) } for k,v := range values{ f.SetCellValue("Sheet1",k,v) } err := f.AddChart("Sheet1","E1",`{"type":"col3DClustered","series":[{"name":"Sheet1!$A$2","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$2:$D$2"},{"name":"Sheet1!$A$3","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$3:$D$3"},{"name":"Sheet1!$A$4","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$4:$D$4"}],"title":{"name":"Fruit 3D Clustered Column Chart"}}`) if err != nil { fmt.Println(err) } // 根据指定路径保存文件 err = f.SaveAs("./Book1.xlsx") if err != nil { fmt.Println(err) } } ``` ### 向文档中插入图片 ``` package main import ( "fmt" _ "image/jpeg" "github.com/360EntSecGroup-Skylar/excelize/v2" ) func main() { f,err := excelize.OpenFile("./Book1.xlsx") if err != nil{ fmt.Println(err.Error()) return } //插入图片 err = f.AddPicture("Sheet1","K2",".//touxiang.jpg","") if err != nil{ fmt.Println(err) return } //在工作表中插入图片并设置图片缩放比例 err = f.AddPicture("Sheet1","D2","./touxiang.jpg",`{"x_scale": 0.5, "y_scale": 0.5}`) if err != nil{ fmt.Println(err) return } //在工作表中插入图片,并设置图片的打印属性 err = f.AddPicture("Sheet1", "H2", "./touxiang.jpg", `{"x_offset": 15, "y_offset": 10, "print_obj": true, "lock_aspect_ratio": false, "locked": false}`) if err != nil { fmt.Println(err) } // 保存文件 err = f.Save() if err != nil { fmt.Println(err) } } ``` ## 工作簿 ### 创建 ``` func NewFile() *File ``` 使用 `NewFile` 新建 Excel 工作薄,新创建的工作簿中会默认包含一个名为 `Sheet1` 的工作表。 ### 打开 ``` func OpenFile(filename string) (*File, error) ``` 使用 `OpenFile` 打开已有 Excel 文档。 ### 保存 ``` func (f *File) Save() error ``` 使用 `Save` 保存对 Excel 文档的编辑。 ### 另存为 ``` func (f *File) SaveAs(name string) error ``` 使用 `SaveAs` 保存 Excel 文档为指定文件。 ## 工作表 ### 新建工作表 ``` func (f *File) NewSheet(name string) int ``` 根据给定的工作表名称添加新的工作表,并返回工作表索引。新创建的工作簿将会包含一个名为 `Sheet1` 的默认工作簿。 ### 删除工作表 ``` func (f *File) DeleteSheet(name string) ``` 根据给定的工作表名称删除指定工作表,谨慎使用此方法,这将会影响到与被删除工作表相关联的公式、引用、图表等元素。如果有其他组件引用了被删除工作表上的值,将会引发错误提示,甚至将会导致打开工作簿失败。当工作簿中仅包含一个工作表时,调用此方法无效。 ### 复制工作表 ``` func (f *File) CopySheet(from, to int) error ``` 根据给定的被复制工作表与目标工作表索引复制工作表,目标工作表索引需要开发者自行确认是否已经存在。目前支持仅包含单元格值和公式的工作表间的复制,不支持包含表格、图片、图表和透视表等元素的工作表之间的复制。 ``` // 名称为 Sheet1 的工作表已经存在 ... index := f.NewSheet("Sheet2") err := f.CopySheet(1, index) return err ``` ### 设置工作表背景图片 ``` func (f *File) SetSheetBackground(sheet, picture string) error ``` 根据给定的工作表名称和图片地址为指定的工作表设置平铺效果的背景图片 ### 设置默认工作表 ``` func (f *File) SetActiveSheet(index int) ``` 根据给定的索引值设置默认工作表,索引的值应该大于 `0` 且小于工作簿所包含的累积工作表总数。 ### 获取默认工作表索引 ``` func (f *File) GetActiveSheetIndex() int ``` 获取默认工作表的索引,如果没有找到默认工作表将返回 `0`。 ### 获取工作表视图属性 ``` func (f *File) GetSheetViewOptions(name string, viewIndex int, opts ...SheetViewOptionPtr) error ``` 根据给定的工作表名称、视图索引和视图参数获取工作表视图属性,`viewIndex` 可以是负数,如果是这样,则向后计数(`-1` 代表最后一个视图)。 | 可选视图参数 | 类型 | | :---------------- | :--- | | DefaultGridColor | bool | | RightToLeft | bool | | ShowFormulas | bool | | ShowGridLines | bool | | ShowRowColHeaders | bool | - 例1,获取名为 `Sheet1` 的工作表上最后一个视图的网格线属性设置: ``` var showGridLines excelize.ShowGridLines err = f.GetSheetViewOptions("Sheet1", -1, &showGridLines) ``` - 例2 ``` xl := excelize.NewFile() const sheet = "Sheet1" var ( defaultGridColor excelize.DefaultGridColor rightToLeft excelize.RightToLeft showFormulas excelize.ShowFormulas showGridLines excelize.ShowGridLines showRowColHeaders excelize.ShowRowColHeaders zoomScale excelize.ZoomScale topLeftCell excelize.TopLeftCell ) if err := xl.GetSheetViewOptions(sheet, 0, &defaultGridColor, &rightToLeft, &showFormulas, &showGridLines, &showRowColHeaders, &zoomScale, &topLeftCell, ); err != nil { panic(err) } fmt.Println("Default:") fmt.Println("- defaultGridColor:", defaultGridColor) fmt.Println("- rightToLeft:", rightToLeft) fmt.Println("- showFormulas:", showFormulas) fmt.Println("- showGridLines:", showGridLines) fmt.Println("- showRowColHeaders:", showRowColHeaders) fmt.Println("- zoomScale:", zoomScale) fmt.Println("- topLeftCell:", `"`+topLeftCell+`"`) if err := xl.SetSheetViewOptions(sheet, 0, excelize.TopLeftCell("B2")); err != nil { panic(err) } if err := xl.GetSheetViewOptions(sheet, 0, &topLeftCell); err != nil { panic(err) } if err := xl.SetSheetViewOptions(sheet, 0, excelize.ShowGridLines(false)); err != nil { panic(err) } if err := xl.GetSheetViewOptions(sheet, 0, &showGridLines); err != nil { panic(err) } fmt.Println("After change:") fmt.Println("- showGridLines:", showGridLines) fmt.Println("- topLeftCell:", topLeftCell) 输出: Default: - defaultGridColor: true - rightToLeft: false - showFormulas: false - showGridLines: true - showRowColHeaders: true - zoomScale: 0 - topLeftCell: "" After change: - showGridLines: false - topLeftCell: B2 ``` ### 设置工作表页面布局 ``` func (f *File) SetPageLayout(sheet string, opts ...PageLayoutOption) error ``` 根据给定的工作表名称和页面布局参数设置工作表的页面布局属性。目前支持设置的页面布局属性: - 通过 `PageLayoutOrientation` 方法设置页面布局方向,默认页面布局方向为“纵向”。下面的表格是 Excelize 中页面布局方向 `PageLayoutOrientation` 参数的列表: | 参数 | 方向 | | :------------------- | :--- | | OrientationPortrait | 纵向 | | OrientationLandscape | 横向 | - 通过 `PageLayoutPaperSize` 方法设置页面纸张大小,默认页面布局大小为“信纸 8½ × 11 英寸”。下面的表格是 Excelize 中页面布局大小和索引 `PageLayoutPaperSize` 参数的关系对照: | 索引 | 纸张大小 | | :--- | :-------------------------------------------- | | 1 | 信纸 8½ × 11 英寸 | | 2 | 简式信纸 8½ × 11 英寸 | | 3 | 卡片 11 × 17 英寸 | | 4 | 账单 17 × 11 英寸 | | 5 | 律师公文纸 8½ × 14 英寸 | | 6 | 报告单 5½ × 8½ 英寸 | | 7 | 行政公文纸 7½ × 10 英寸 | | 8 | A3 297 × 420 毫米 | | 9 | A4 210 × 297 毫米 | | 10 | A4(小) 210 × 297 毫米 | | 11 | A5 148 × 210 毫米 | | 12 | B4 250 × 353 毫米 | | 13 | B5 176 × 250 毫米 | | 14 | 对开本 8½ × 13 英寸 | | 15 | 四开 215 × 275 毫米 | | 16 | 美式标准纸张 10 × 14 英寸 | | 17 | 美式标准纸张 11 × 17 英寸 | | 18 | Note paper 8.5 × 11 英寸 | | 19 | 信封 #9 3.875 × 8.875 英寸 | | 20 | 信封 #10 4-1/8 × 9½ 英寸 | | 21 | 信封 #11 4.5 × 10.375 英寸 | | 22 | 信封 #12 4.75 × 11 英寸 | | 23 | 信封 #14 5 × 11.5 英寸 | | 24 | C paper 17 × 22 英寸 | | 25 | D paper 22 × 34 英寸 | | 26 | E paper 34 × 44 英寸 | | 27 | 信封 DL 110 × 220 毫米 | | 28 | 信封 C5 162 × 229 毫米 | | 29 | 信封 C3 324 × 458 毫米 | | 30 | 信封 C4 229 × 324 毫米 | | 31 | 信封 C6 114 × 162 毫米 | | 32 | 信封 C65 114 × 229 毫米 | | 33 | 信封 B4 250 × 353 毫米 | | 34 | 信封 B5 176 × 250 毫米 | | 35 | 信封 B6 176 × 125 毫米 | | 36 | 信封 Italy 110 × 230 毫米 | | 37 | 君主式信封 3.88 × 7.5 英寸 | | 38 | 信封 6 3/4 3.625 × 6.5 英寸 | | 39 | US standard fanfold 14.875 × 11 英寸 | | 40 | German standard fanfold 8.5 × 12 英寸 | | 41 | German legal fanfold 8.5 × 13 英寸 | | 42 | ISO B4 250 × 353 毫米 | | 43 | 日式明信片 100 × 148 毫米 | | 44 | Standard paper 9 × 11 英寸 | | 45 | Standard paper 10 × 11 英寸 | | 46 | Standard paper 15 × 11 英寸 | | 47 | 邀请信 220 × 220 毫米 | | 50 | Letter extra paper 9.275 × 12 英寸 | | 51 | Legal extra paper 9.275 × 15 英寸 | | 52 | Tabloid extra paper 11.69 × 18 英寸 | | 53 | A4 extra paper 236 × 322 毫米 | | 54 | Letter transverse paper 8.275 × 11 英寸 | | 55 | A4 transverse paper 210 × 297 毫米 | | 56 | Letter extra transverse paper 9.275 × 12 英寸 | | 57 | SuperA/SuperA/A4 paper 227 × 356 毫米 | | 58 | SuperB/SuperB/A3 paper 305 × 487 毫米 | | 59 | Letter plus paper 8.5 × 12.69 英寸 | | 60 | A4 plus paper 210 × 330 毫米 | | 61 | A5 transverse paper 148 × 210 毫米 | | 62 | JIS B5 transverse paper 182 × 257 毫米 | | 63 | A3 extra paper 322 × 445 毫米 | | 64 | A5 extra paper 174 × 235 毫米 | | 65 | ISO B5 extra paper 201 × 276 毫米 | | 66 | A2 420 × 594 毫米 | | 67 | A3 transverse paper 297 × 420 毫米 | | 68 | A3 extra transverse paper 322 × 445 毫米 | | 69 | 双层日式明信片 200 × 148 毫米 | | 70 | A6 105 × 148 毫米 | | 71 | 日式信封 Kaku #2 | | 72 | 日式信封 Kaku #3 | | 73 | 日式信封 Chou #3 | | 74 | 日式信封 Chou #4 | | 75 | Letter Rotated (11in x 8 1/2 11 in) | | 76 | A3 横向旋转 420 × 297 毫米 | | 77 | A4 横向旋转 297 × 210 毫米 | | 78 | A5 横向旋转 210 × 148 毫米 | | 79 | B4 (JIS) 横向旋转 364 × 257 毫米 | | 80 | B5 (JIS) 横向旋转 257 × 182 毫米 | | 81 | 日式明信片 横向旋转 148 × 100 毫米 | | 82 | 双层日式明信片 横向旋转 148 × 200 毫米 | | 83 | A6 横向旋转 148 × 105 毫米 | | 84 | 日式信封 Kaku #2 横向旋转 | | 85 | 日式信封 Kaku #3 横向旋转 | | 86 | 日式信封 Chou #3 横向旋转 | | 87 | 日式信封 Chou #4 横向旋转 | | 88 | B6 (JIS) 128 × 182 毫米 | | 89 | B6 (JIS) 横向旋转 182 × 128 毫米 | | 90 | 12 × 11 英寸 | | 91 | 日式信封 You #4 | | 92 | 日式信封 You #4 横向旋转 | | 93 | 中式 16 开 146 × 215 毫米 | | 94 | 中式 32 开 97 × 151 毫米 | | 95 | 中式大 32 开 97 × 151 毫米 | | 96 | 中式信封 #1 102 × 165 毫米 | | 97 | 中式信封 #2 102 × 176 毫米 | | 98 | 中式信封 #3 125 × 176 毫米 | | 99 | 中式信封 #4 110 × 208 毫米 | | 100 | 中式信封 #5 110 × 220 毫米 | | 101 | 中式信封 #6 120 × 230 毫米 | | 102 | 中式信封 #7 160 × 230 毫米 | | 103 | 中式信封 #8 120 × 309 毫米 | | 104 | 中式信封 #9 229 × 324 毫米 | | 105 | 中式信封 #10 324 × 458 毫米 | | 106 | 中式 16 开 横向旋转 | | 107 | 中式 32 开 横向旋转 | | 108 | 中式大 32 开 横向旋转 | | 109 | 中式信封 #1 横向旋转 165 × 102 毫米 | | 110 | 中式信封 #2 横向旋转 176 × 102 毫米 | | 111 | 中式信封 #3 横向旋转 176 × 125 毫米 | | 112 | 中式信封 #4 横向旋转 208 × 110 毫米 | | 113 | 中式信封 #5 横向旋转 220 × 110 毫米 | | 114 | 中式信封 #6 横向旋转 230 × 120 毫米 | | 115 | 中式信封 #7 横向旋转 230 × 160 毫米 | | 116 | 中式信封 #8 横向旋转 309 × 120 毫米 | | 117 | 中式信封 #9 横向旋转 324 × 229 毫米 | | 118 | 中式信封 #10 横向旋转 458 × 324 毫米 | - 例如,将名为 `Sheet1` 的工作表页面布局设置为横向并使用 A4(小) 210 × 297 毫米纸张: ``` xl := excelize.NewFile() const sheet = "Sheet1" if err := xl.SetPageLayout( "Sheet1", excelize.PageLayoutOrientation(excelize.OrientationLandscape), ); err != nil { panic(err) } if err := xl.SetPageLayout( "Sheet1", excelize.PageLayoutPaperSize(10), ); err != nil { panic(err) } ``` ### 获取工作表页面布局 ``` func (f *File) GetPageLayout(sheet string, opts ...PageLayoutOptionPtr) error ``` 根据给定的工作表名称和页面布局参数获取工作表的页面布局属性。 - 通过 `PageLayoutOrientation` 方法获取页面布局方向 - 通过 `PageLayoutPaperSize` 方法获取页面纸张大小 例如,获取名为 `Sheet1` 的工作表页面布局设置: ``` xl := excelize.NewFile() const sheet = "Sheet1" var ( orientation excelize.PageLayoutOrientation paperSize excelize.PageLayoutPaperSize ) if err := xl.GetPageLayout("Sheet1", &orientation); err != nil { panic(err) } if err := xl.GetPageLayout("Sheet1", &paperSize); err != nil { panic(err) } fmt.Println("Defaults:") fmt.Printf("- orientation: %q\n", orientation) fmt.Printf("- paper size: %d\n", paperSize) // Output: // Defaults: // - orientation: "portrait" // - paper size: 1 ``` ### 设置列可见性 ``` func (f *File) SetColVisible(sheet, col string, visible bool) error ``` 根据给定的工作表名称(大小写敏感)和列名称设置列可见性。例如隐藏名为 `Sheet1` 工作表上的 `D` 列: ``` err := f.SetColVisible("Sheet1", "D", false) ``` ### 设置列宽度 ``` func (f *File) SetColWidth(sheet, startcol, endcol string, width float64) error ``` 根据给定的工作表名称(大小写敏感)、列范围和宽度值设置单个或多个列的宽度。例如设置名为 `Sheet1` 工作表上 `A` 到 `H` 列的宽度为 `20`: ``` f := excelize.NewFile() err := f.SetColWidth("Sheet1","A","H",20) ``` ### 设置行高度 ``` func (f *File) SetRowHeight(sheet string, row int, height float64) error ``` 根据给定的工作表名称(大小写敏感)、行号和高度值设置单行高度。例如设置名为 `Sheet1` 工作表首行的高度为 `50`: ``` err := f.SetRowHeight("Sheet1", 1, 50) ``` ### 设置行可见性 ``` func (f *File) SetRowVisible(sheet string, row int, visible bool) error ``` 根据给定的工作表名称(大小写敏感)和行号设置行可见性。例如隐藏名为 `Sheet1` 工作表上第二行: ``` err := f.SetRowVisible("Sheet1", 2, false) ``` ### 获取工作表名 ``` func (f *File) GetSheetName(index int) string ``` 根据给定的工作表索引获取工作表名称,如果工作表不存在将返回空字符。 ### 获取列可见性 ``` func (f *File) GetColVisible(sheet, column string) (bool, error) ``` 根据给定的工作表名称(大小写敏感)和列名获取工作表中指定列的可见性,可见返回值为 `true`,否则为 `false`。例如,获取名为 `Sheet1` 的工作表上 `D` 列的可见性: ``` visible, err := f.GetColVisible("Sheet1", "D") ``` ### 获取列宽度 ``` func (f *File) GetColWidth(sheet, col string) (float64, error) ``` 根据给定的工作表和列名获取工作表中指定列的宽度。 ### 获取行高度 ``` func (f *File) GetRowHeight(sheet string, row int) (float64, error) ``` 根据给定的工作表名称(大小写敏感)和行号获取工作表中指定行的高度。例如,获取名为 `Sheet1` 的工作表首行的高度: ``` height, err := f.GetRowHeight("Sheet1", 1) ``` ### 获取行可见性 ``` func (f *File) GetRowVisible(sheet string, row int) (bool, error) ``` 根据给定的工作表名称(大小写敏感)和行号获取工作表中指定行的可见性。例如,获取名为 `Sheet1` 的工作表第 2 行的可见性: ``` err := f.GetRowVisible("Sheet1", 2) ``` ### 获取工作表索引 ``` func (f *File) GetSheetIndex(name string) int ``` 根据给定的工作表名称(大小写敏感)获取该工作表的索引,如果工作表不存在将返回 `0`。获取到的索引可以在设置工作簿默认工作表时,作为调用 [`SetActiveSheet()`](https://xuri.me/excelize/zh-hans/workbook.html#SetActiveSheet) 函数的参数使用。 ### 获取工作表列表 ``` func (f *File) GetSheetMap() map[int]string ``` 获取工作簿中以名称和索引构成的全部工作表的列表。 ``` f, err := excelize.OpenFile("./Book1.xlsx") if err != nil { return } for index, name := range f.GetSheetMap() { fmt.Println(index, name) } ``` ### 获取工作表属性 ``` func (f *File) GetSheetPrOptions(name string, opts ...SheetPrOptionPtr) error ``` 根据给定的工作表名称(大小写敏感)和筛选想获取工作表属性。 | 可选属性 | 类型 | | :-------------------------------- | :----- | | CodeName | string | | EnableFormatConditionsCalculation | bool | | Published | bool | | FitToPage | bool | | AutoPageBreaks | bool | | OutlineSummaryBelow | bool | 例如: ``` xl := excelize.NewFile() const sheet = "Sheet1" var ( codeName excelize.CodeName enableFormatConditionsCalculation excelize.EnableFormatConditionsCalculation published excelize.Published fitToPage excelize.FitToPage autoPageBreaks excelize.AutoPageBreaks outlineSummaryBelow excelize.OutlineSummaryBelow ) if err := xl.GetSheetPrOptions(sheet, &codeName, &enableFormatConditionsCalculation, &published, &fitToPage, &autoPageBreaks, &outlineSummaryBelow, ); err != nil { panic(err) } fmt.Println("Defaults:") fmt.Printf("- codeName: %q\n", codeName) fmt.Println("- enableFormatConditionsCalculation:", enableFormatConditionsCalculation) fmt.Println("- published:", published) fmt.Println("- fitToPage:", fitToPage) fmt.Println("- autoPageBreaks:", autoPageBreaks) fmt.Println("- outlineSummaryBelow:", outlineSummaryBelow) 输出 Defaults: - codeName: "" - enableFormatConditionsCalculation: true - published: true - fitToPage: false - autoPageBreaks: false - outlineSummaryBelow: true ``` ### 插入列 ``` func (f *File) InsertCol(sheet, column string) error ``` 根据给定的工作表名称(大小写敏感)和列名称,在指定列前插入空白列。例如,在名为 `Sheet1` 的工作表的 `C` 列前插入空白列: ``` err := f.InsertCol("Sheet1", "C") ``` ### 插入行 ``` func (f *File) InsertRow(sheet string, row int) error ``` 根据给定的工作表名称(大小写敏感)和行号,在指定行前插入空白行。例如,在名为 `Sheet1` 的工作表的第 3 行前插入空白行: ``` err := f.InsertRow("Sheet1", 3) ``` ### 追加复制行 ``` func (f *File) DuplicateRow(sheet string, row int) error ``` 根据给定的工作表名称(大小写敏感)和行号,在该行后追加复制。例如,将名为 `Sheet1` 的工作表的第 2 行复制到第 3 行: ``` err := f.DuplicateRow("Sheet1", 2) ``` 请谨慎使用此方法,这将影响所有对该工作表中原有公式、图表等资源引用的更改。如果该工作表包含任何引用值,在使用此方法后使用 Excel 应用程序打开它时将可能导致文件错误。excelize 目前仅支持对工作表上部分引用对更新。 ### 复制行 ``` func (f *File) DuplicateRowTo(sheet string, row, row2 int) error ``` 根据给定的工作表名称(大小写敏感)和行号,在指定行后复制该行。例如,将名为 `Sheet1` 的工作表的第 2 行后复制到第 7 行: ``` err := f.DuplicateRowTo("Sheet1", 2, 7) ``` 请谨慎使用此方法,这将影响所有对该工作表中原有公式、图表等资源引用的更改。如果该工作表包含任何引用值,在使用此方法后使用 Excel 应用程序打开它时将可能导致文件错误。excelize 目前仅支持对工作表上部分引用对更新。 ### 创建行的分级显示 ``` func (f *File) SetRowOutlineLevel(sheet string, row int, level uint8) error ``` 根据给定的工作表名称(大小写敏感)、行号和分级参数创建组。例如,在名为 `Sheet1` 的工作表的第 2 行创建 1 级分组。 ``` err := f.SetRowOutlineLevel("Sheet1", 2, 1) ``` ### 创建列的分级显示 ``` func (f *File) SetColOutlineLevel(sheet, col string, level uint8) error ``` 根据给定的工作表名称(大小写敏感)、列名称和分级参数创建组。例如,在名为 `Sheet1` 的工作表的 `D` 列创建 2 级分组。 ``` err := f.SetColOutlineLevel("Sheet1", "D", 2) ``` ### 获取行的分级显示 ``` func (f *File) GetRowOutlineLevel(sheet string, row int) (uint8, error) ``` 根据给定的工作表名称(大小写敏感)和行号获取分组级别。例如,获取名为 `Sheet1` 的工作表第 2 行的分组级别。 ``` err := f.GetRowOutlineLevel("Sheet1", 2) ``` ### 获取列的分级显示 ``` func (f *File) GetColOutlineLevel(sheet, col string) (uint8, error) ``` 根据给定的工作表名称(大小写敏感)和列名称获取分组分级。例如,获取名为 `Sheet1` 的工作表的 `D` 列的分组级别。 ``` level, err := f.GetColOutlineLevel("Sheet1", "D") ``` ### 行迭代器 ``` func (f *File) Rows(sheet string) (*Rows, error) ``` 根据给定的工作表名称(大小写敏感)获取该工作表的行迭代器。使用行迭代器遍历单元格: ``` rows, err := f.Rows("Sheet1") for rows.Next() { row, err := rows.Columns() for _, colCell := range row { fmt.Print(colCell, "\t") } fmt.Println() } ``` ### 行迭代器 - 单行操作 ``` func (rows *Rows) Columns() ([]string, error) ``` 返回当前行所有列的值。 ### 行迭代器 - 遍历操作 ``` func (rows *Rows) Next() bool ``` 如果下一行有值存在将返回 `true`。 ### 行迭代器 - 错误处理 ``` func (rows *Rows) Error() error ``` 当查找下一行出现错误时将返回 `error`。 ### 在工作表中搜索 ``` func (f *File) SearchSheet(sheet, value string, reg ...bool) ([]string, error) ``` 根据给定的工作表名称(大小写敏感),单元格值或正则表达式来获取坐标。此函数仅支持字符串和数字的完全匹配,不支持公式计算后的结果、格式化数字和条件搜索。如果搜索结果是合并的单元格,将返回合并区域左上角的坐标。 例如,在名为 `Sheet1` 的工作表中搜索值 `100` 的坐标: ``` result, err := f.SearchSheet("Sheet1", "100") ``` 例如,在名为 `Sheet1` 的工作表中搜索 `0-9` 范围内数值的坐标: ``` result, err := f.SearchSheet("Sheet1", "[0-9]", true) ``` ### 保护工作表 ``` func (f *File) ProtectSheet(sheet string, settings *FormatSheetProtection) error ``` 防止其他用户意外或有意更改、移动或删除工作表中的数据。例如,为名为 `Sheet1` 的工作表设置密码保护,但是允许选择锁定的单元格、选择未锁定的单元格、编辑方案: ``` err := f.ProtectSheet("Sheet1", &excelize.FormatSheetProtection{ Password: "password", EditScenarios: false, }) ``` ### 取消保护工作表 ``` func (f *File) UnprotectSheet(sheet string) error ``` 根据给定的工作表名称(大小写敏感)取消保护该工作表。 ## 单元格 ### 设置单元格的值 ``` func (f *File)SetCellValue(sheet, axis string, value interface{}) error ``` 根据给定的工作表名和单元格坐标设置单元格的值。 | 支持的数据类型 | | :------------- | | int | | int8 | | int16 | | int32 | | int64 | | uint | | uint8 | | uint16 | | uint32 | | uint64 | | float32 | | float64 | | string | | []byte | | time.Duration | | time.Time | | bool | | nil | ### 设置布尔型值 ``` func (f *File) SetCellBool(sheet, axis string, value bool) error ``` 根据给定的工作表名和单元格坐标设置布尔型单元格的值。 ### 设置默认字符型值 ``` func (f *File) SetCellDefault(sheet, axis, value string) error ``` 根据给定的工作表名和单元格坐标设置字符型单元格的值,字符将不会进行特殊字符过滤。 ### 设置实数 ``` func (f *File) SetCellInt(sheet, axis string, value int) error ``` 根据给定的工作表名和单元格坐标设置实数单元格的值。 ### 设置字符型值 ``` func (f *File) SetCellStr(sheet, axis, value string) error ``` 根据给定的工作表名和单元格坐标设置字符型单元格的值,字符将会进行特殊字符过滤,并且字符串的累计长度应不超过 `32767`,多余的字符将会被忽略。 ### 设置整行单元格 ``` func (f *File) SetSheetRow(sheet, axis string, slice interface{}) ``` 如下:在A1处开始插入整行 ``` f.SetSheetRow(name,"A1",&[]interface{}{ v.CharacterId, v.ProvinceName, v.CompanyCode, v.CompanyName, v.StoreCode, v.StoreName, v.Address, v.Contact, v.Contact1, v.Expireb, v.Expiree, }) ``` ### 设置单元格样式 ``` func (f *File) SetCellStyle(sheet, hcell, vcell string, styleID int) error ``` 根据给定的工作表名、单元格坐标区域和样式索引设置单元格的值。样式索引可以通过 `NewStyle` 函数获取。注意,在同一个坐标区域内的 `diagonalDown` 和 `diagonalUp` 需要保持颜色一致。 - 例1,为名为 `Sheet1` 的工作表 `D7` 单元格设置边框样式: ``` style, err := f.NewStyle(`{"border":[{"type":"left","color":"0000FF","style":3},{"type":"top","color":"00FF00","style":4},{"type":"bottom","color":"FFFF00","style":5},{"type":"right","color":"FF0000","style":6},{"type":"diagonalDown","color":"A020F0","style":7},{"type":"diagonalUp","color":"A020F0","style":8}]}`) if err != nil { fmt.Println(err) } err = f.SetCellStyle("Sheet1", "D7", "D7", style) ``` 单元格 `D7` 的四个边框被设置了不同的样式和颜色,这与调用 `NewStyle` 函数时的参数有关,需要设置不同的样式可参考该章节的文档。 - 例2,为名为 `Sheet1` 的工作表 `D7` 单元格设置渐变样式: ``` style, err := f.NewStyle(`{"fill":{"type":"gradient","color":["#FFFFFF","#E0EBF5"],"shading":1}}`) if err != nil { fmt.Println(err) } err = f.SetCellStyle("Sheet1", "D7", "D7", style) ``` 单元格 `D7` 被设置了渐变效果的颜色填充,渐变填充效果与调用 `NewStyle` 函数时的参数有关,需要设置不同的样式可参考该章节的文档。 - 例3,为名为 `Sheet1` 的工作表 `D7` 单元格设置纯色填充: ``` style, err := f.NewStyle(`{"fill":{"type":"pattern","color":["#E0EBF5"],"pattern":1}}`) if err != nil { fmt.Println(err) } err = f.SetCellStyle("Sheet1", "D7", "D7", style) ``` 单元格 `D7` 被设置了纯色填充。 - 例4,为名为 `Sheet1` 的工作表 `D7` 单元格设置字符间距与旋转角度: ``` f.SetCellValue("Sheet1", "D7", "样式") style, err := f.NewStyle(`{"alignment":{"horizontal":"center","ident":1,"justify_last_line":true,"reading_order":0,"relative_indent":1,"shrink_to_fit":true,"text_rotation":45,"vertical":"","wrap_text":true}}`) if err != nil { fmt.Println(err) } err = f.SetCellStyle("Sheet1", "D7", "D7", style) ``` - 例5,Excel 中的日期和时间用实数表示,例如 `2017/7/4 12:00:00 PM` 可以用数字 `42920.5` 来表示。为名为 `Sheet1` 的工作表 `D7` 单元格设置时间格式: ``` f.SetCellValue("Sheet1", "D7", 42920.5) f.SetColWidth("Sheet1", "D", "D", 13) style, err := f.NewStyle(`{"number_format": 22}`) if err != nil { fmt.Println(err) } err = f.SetCellStyle("Sheet1", "D7", "D7", style) ``` 单元格 `D7` 被设置了时间格式。注意,当应用了时间格式的单元格宽度过窄无法完整展示时会显示为 `####`,可以拖拽调整列宽或者通过调用 `SetColWidth` 函数设置列款到合适的大小使其正常显示。 - 例6,为名为 `Sheet1` 的工作表 `D7` 单元格设置字体、字号、颜色和倾斜样式: ``` f.SetCellValue("Sheet1", "D7", "Excel") style, err := f.NewStyle(`{"font":{"bold":true,"italic":true,"family":"Berlin Sans FB Demi","size":36,"color":"#777777"}}`) if err != nil { fmt.Println(err) } err = f.SetCellStyle("Sheet1", "D7", "D7", style) ``` - 例7,锁定并隐藏名为 `Sheet1` 的工作表 `D7` 单元格: ``` style, err := f.NewStyle(`{"protection":{"hidden":true, "locked":true}}`) if err != nil { fmt.Println(err) } err = f.SetCellStyle("Sheet1", "D7", "D7", style) ``` 要锁定单元格或隐藏公式,请保护工作表。在“审阅”选项卡上,单击“保护工作表” ### 设置超链接 ``` func (f *File) SetCellHyperLink(sheet, axis, link, linkType string) error ``` 根据给定的工作表、单元格坐标、链接资源和资源类型设置单元格的超链接。资源类型分为外部链接地址 `External` 和工作簿内部位置链接 `Location` 两种。每个工作表中的包含最大超链接限制为 `65530` 个。 - 例1,为名为 `Sheet1` 的工作表 `A3` 单元格添加外部链接: ``` err := f.SetCellHyperLink("Sheet1", "A3", "https://github.com/360EntSecGroup-Skylar/excelize", "External") // 为单元格设置字体和下划线样式 style, err := f.NewStyle(`{"font":{"color":"#1265BE","underline":"single"}}`) err = f.SetCellStyle("Sheet1", "A3", "A3", style) ``` - 例2,为名为 `Sheet1` 的工作表 `A3` 单元格添加内部位置链接: ``` err := f.SetCellHyperLink("Sheet1", "A3", "Sheet1!A40", "Location") ``` ### 获取单元格的值 ``` func (f *File) GetCellValue(sheet, axis string) (string, error) ``` 根据给定的工作表和单元格坐标获取单元格的值,返回值将转换为 `string` 类型。如果可以将单元格格式应用于单元格的值,将返回应用后的值,否则将返回原始值。 ### 获取全部单元格的值 ``` func (f *File) GetRows(sheet string) ([][]string, error) ``` 根据给定的工作表名(大小写敏感)获取该工作表上全部单元格的值,以二维数组形式返回,其中单元格的值将转换为 `string` 类型。如果可以将单元格格式应用于单元格的值,将使用应用后的值,否则将使用原始值。 例如,获取并遍历输出名为 `Sheet1` 的工作表上的所有单元格的值: ``` rows, err := f.GetRows("Sheet1") for _, row := range rows { for _, colCell := range row { fmt.Print(colCell, "\t") } fmt.Println() } ``` ### 获取超链接 ``` func (f *File) GetCellHyperLink(sheet, axis string) (bool, string, error) ``` 根据给定的工作表名(大小写敏感)和单元格坐标获取单元格超链接,如果该单元格存在超链接,将返回 `true` 和链接地址,否则将返回 `false` 和空的链接地址。 例如,获取名为 `Sheet1` 的工作表上坐标为 `H6` 单元格的超链接: ``` link, target, err := f.GetCellHyperLink("Sheet1", "H6") ``` ### 获取样式索引 ``` func (f *File) GetCellStyle(sheet, axis string) (int, error) ``` 根据给定的工作表名(大小写敏感)和单元格坐标获取单元格样式索引,获取到的索引可以在复制单元格样式时,作为调用 `SetCellValue` 函数的参数使用。 ### 合并单元格 ``` func (f *File) MergeCell(sheet, hcell, vcell string) error ``` 根据给定的工作表名(大小写敏感)和单元格坐标区域合并单元格。例如,合并名为 `Sheet1` 的工作表上 `D3:E9` 区域内的单元格: ``` err := f.MergeCell("Sheet1", "D3", "E9") ``` 如果给定的单元格坐标区域与已有的其他合并单元格相重叠,已有的合并单元格将会被删除。 ### 获取合并单元格 根据给定的工作表名(大小写敏感)获取全部合并单元格的坐标区域和值。 ``` func (f *File) GetMergeCells(sheet string) ([]MergeCell, error) ``` ### 添加批注 ``` func (f *File) AddComment(sheet, cell, format string) error ``` 根据给定的工作表名称、单元格坐标和样式参数(作者与文本信息)添加批注。作者信息最大长度为 255 个字符,最大文本内容长度为 32512 个字符,超出该范围的字符将会被忽略。例如,为 `Sheet1!$A$3` 单元格添加批注: ``` err := f.AddComment("Sheet1", "A3", `{"author":"Excelize: ","text":"This is a comment."}`) ``` ### 获取批注 ``` func (f *File) GetComments() (comments map[string][]Comment) ``` 通过该方法可以获取全部工作表中的批注。 ### 设置公式 ``` func (f *File) SetCellFormula(sheet, axis, formula string) ``` 根据给定的工作表名(大小写敏感)和单元格坐设置取该单元格上的公式。公式的结果会在工作表被 Office Excel 应用程序打开时计算,Excelize 目前不提供公式计算引擎,所以无法计算公式结果。 ### 获取公式 ``` func (f *File) GetCellFormula(sheet, axis string) (string, error) ``` 根据给定的工作表名(大小写敏感)和单元格坐标获取该单元格上的公式。 ## 添加图表 ``` func (f *File) AddChart(sheet, cell, format string) error ``` 根据给定的工作表名称、单元格坐标和图表样式属性插入图表。 下面是 Excelize 支持创建的图表类型 `type`: | 名称 | 图表类型 | | :------------------- | :------------------- | | area | 二维面积图 | | areaStacked | 二维堆积面积图 | | areaPercentStacked | 二维百分比堆积面积图 | | area3D | 三维面积图 | | area3DStacked | 三维堆积面积图 | | area3DPercentStacked | 三维百分比堆积面积图 | | bar | 二维簇状条形图 | | barStacked | 二维堆积条形图 | | barPercentStacked | 二维百分比堆积条形图 | | bar3DClustered | 三维簇状条形图 | | bar3DStacked | 三维堆积条形图 | | bar3DPercentStacked | 三维百分比堆积条形图 | | col | 二维簇状柱形图 | | colStacked | 二维堆积柱形图 | | colPercentStacked | 二维百分比堆积柱形图 | | col3DClustered | 三维簇状柱形图 | | col3D | 三维柱形图 | | col3DStacked | 三维堆积柱形图 | | col3DPercentStacked | 三维百分比堆积柱形图 | | doughnut | 圆环图 | | line | 折线图 | | pie | 饼图 | | pie3D | 三维饼图 | | radar | 雷达图 | | scatter | 散点图 | 在 Office Excel 中图表数据区域 `series` 指定了绘制哪些数据的信息集合、图例项(系列)和水平(分类)轴标签。 下面是 Excelize 中 `series` 的可选参数: | 参数 | 含义 | | :--------- | :----------------------------------------------------------- | | name | 图例项(系列),在图表图例和公式栏中显示。`name` 参数是可选的,如果不指定该值默认将会使用 `Series 1 .. n` 表示。`name` 支持使用公式表示,例如:`Sheet1!$A$1`。 | | categories | 水平(分类)轴标签。在大多数图表类型中,`categories` 属性是可选的,默认为形如 `1..n` 的连续序列。 | | values | 图表数据区域,是 `series` 中最重要的参数,也是创建图表时唯一的必选参数。该选项将图表与其显示的工作表数据链接起来。 | 参数 `legend` 提供对图例项的属性设置方法,下面是 Excelize 中 `legend` 的可选参数: | 参数 | 类型 | 含义 | | :-------------- | :----- | :----------------------- | | position | string | 图例位置 | | show_legend_key | bool | 显示图例,但不与图表重叠 | 其中参数 `position` 默认值为 `right`,下面是可选值: | 可选值 | 含义 | | :-------- | :--- | | top | 靠上 | | bottom | 靠下 | | left | 靠左 | | right | 靠右 | | top_right | 右上 | 其中参数 `show_legend_key` 默认值为 `false`。 通过可选 `title` 对象的 `name` 参数设置图表标题,标题将会在图表上方显示。参数 `name` 支持使用公式表示,例如 `Sheet1!$A$1`,如果不指定图标标题默认值为空。 参数 `show_blanks_as` 提供“隐藏和清空单元格”设置,默认值为: `gap` 即“空单元格显示为”:“空距”。下面是该参数的可选值: | 值 | 含义 | | :--- | :--------------- | | gap | 空距 | | span | 用直线连接数据点 | | zero | 零值 | 参数 `format` 提供对图表偏移、缩放、高宽比设置和打印属性等参数的设置,其参数与在 [`AddPicture()`](https://xuri.me/excelize/zh-hans/image.html#AddPicture) 函数中所使用的相同。 通过可选 `plotarea` 对象设置数据标签格式,可选参数如下: | 参数 | 类型 | 默认值 | 含义 | | :---------------- | :--- | :------ | :--------- | | show_bubble_size | bool | `false` | 气泡大小 | | show_cat_name | bool | `true` | 类别名称 | | show_leader_lines | bool | `false` | 显示引导线 | | show_percent | bool | `false` | 百分比 | | show_series_name | bool | `false` | 系列名称 | | show_val | bool | `false` | 值 | 通过参数 `x_axis` 和 `y_axis` 参数设置坐标轴选项。下面是该参数的可选值: | 参数 | 类型 | 默认值 | 含义 | | :------------ | :--- | :------ | :------------------- | | reverse_order | bool | `false` | 逆序刻度值 | | maximum | int | `0` | 最大值,`0` 代表自动 | | minimum | int | `0` | 最小值,`0` 代表自动 | 通过可选 `dimension` 对象设置图表的大小,可选参数如下: | 参数 | 类型 | 默认值 | 含义 | | :----- | :--- | :----- | :--- | | height | int | 290 | 高度 | | width | int | 480 | 宽度 | ### 二维面积图 例如,创建如下效果的二维面积图: ![使用 Go 语言在 Excel 文档中创建二维面积图](https://www.xieys.club/images/posts/82b35549167ca765457735345bdaf043.png) ![使用 Go 语言在 Excel 文档中创建二维面积图](https://www.xieys.club/images/posts/82b35549167ca765457735345bdaf043.png) ``` package main import ( "fmt" "github.com/360EntSecGroup-Skylar/excelize/v2" ) func main() { categories := map[string]string{"A2": "Small", "A3": "Normal", "A4": "Large", "B1": "Apple", "C1": "Orange", "D1": "Pear"} values := map[string]int{"B2": 7, "C2": 7, "D2": 8, "B3": 5, "C3": 4, "D3": 4, "B4": 2, "C4": 3, "D4": 3} f := excelize.NewFile() for k, v := range categories { f.SetCellValue("Sheet1", k, v) } for k, v := range values { f.SetCellValue("Sheet1", k, v) } err := f.AddChart("Sheet1", "E1", `{"type":"area","series":[{"name":"Sheet1!$A$2","categories":"","values":"Sheet1!$B$2:$D$2"},{"name":"Sheet1!$A$3","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$3:$D$3"},{"name":"Sheet1!$A$4","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$4:$D$4"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"bottom","show_legend_key":false},"title":{"name":"Fruit 2D Area Chart"},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":true,"show_val":true},"show_blanks_as":"zero"}`) if err != nil { fmt.Println(err) } // 保存工作簿 err = f.SaveAs("./Book1.xlsx") if err != nil { fmt.Println(err) } } ``` ### 二维堆积面积图 例如,创建如下效果的二维堆积面积图: ![使用 Go 语言在 Excel 文档中创建二维堆积面积图](https://www.xieys.club/images/posts/df7af7f5a29c2f9d17cdc490659b1d28.png) ![使用 Go 语言在 Excel 文档中创建二维堆积面积图](https://www.xieys.club/images/posts/df7af7f5a29c2f9d17cdc490659b1d28.png) ``` package main import ( "fmt" "github.com/360EntSecGroup-Skylar/excelize/v2" ) func main() { categories := map[string]string{"A2": "Small", "A3": "Normal", "A4": "Large", "B1": "Apple", "C1": "Orange", "D1": "Pear"} values := map[string]int{"B2": 2, "C2": 3, "D2": 3, "B3": 5, "C3": 2, "D3": 4, "B4": 6, "C4": 7, "D4": 8} f := excelize.NewFile() for k, v := range categories { f.SetCellValue("Sheet1", k, v) } for k, v := range values { f.SetCellValue("Sheet1", k, v) } err := f.AddChart("Sheet1", "E1", `{"type":"areaStacked","series":[{"name":"Sheet1!$A$2","categories":"","values":"Sheet1!$B$2:$D$2"},{"name":"Sheet1!$A$3","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$3:$D$3"},{"name":"Sheet1!$A$4","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$4:$D$4"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"bottom","show_legend_key":false},"title":{"name":"Fruit 2D Stacked Area Chart"},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":true,"show_val":true},"show_blanks_as":"zero"}`) if err != nil { fmt.Println(err) } // 保存工作簿 err = f.SaveAs("./Book1.xlsx") if err != nil { fmt.Println(err) } } ``` ### 三维面积图 例如,创建如下效果的三维面积图: ![使用 Go 语言在 Excel 文档中创建三维面积图](https://www.xieys.club/images/posts/54d85fe3af386b64c30a940ce1344396.png) ![使用 Go 语言在 Excel 文档中创建三维面积图](https://www.xieys.club/images/posts/54d85fe3af386b64c30a940ce1344396.png) ``` package main import ( "fmt" "github.com/360EntSecGroup-Skylar/excelize/v2" ) func main() { categories := map[string]string{"A2": "Small", "A3": "Normal", "A4": "Large", "B1": "Apple", "C1": "Orange", "D1": "Pear"} values := map[string]int{"B2": 7, "C2": 7, "D2": 8, "B3": 5, "C3": 4, "D3": 4, "B4": 2, "C4": 3, "D4": 3} f := excelize.NewFile() for k, v := range categories { f.SetCellValue("Sheet1", k, v) } for k, v := range values { f.SetCellValue("Sheet1", k, v) } err := f.AddChart("Sheet1", "E1", `{"type":"area3D","series":[{"name":"Sheet1!$A$2","categories":"","values":"Sheet1!$B$2:$D$2"},{"name":"Sheet1!$A$3","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$3:$D$3"},{"name":"Sheet1!$A$4","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$4:$D$4"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"bottom","show_legend_key":false},"title":{"name":"Fruit 3D Area Chart"},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":true,"show_val":true},"show_blanks_as":"zero"}`) if err != nil { fmt.Println(err) } // 保存工作簿 err = f.SaveAs("./Book1.xlsx") if err != nil { fmt.Println(err) } } ``` ### 三维堆积面积图 例如,创建如下效果的三维堆积面积图: ![使用 Go 语言在 Excel 文档中创建三维堆积面积图](https://www.xieys.club/images/posts/aac7f41b8f2063e0c66806f9f459202b.png) ![使用 Go 语言在 Excel 文档中创建三维堆积面积图](https://www.xieys.club/images/posts/aac7f41b8f2063e0c66806f9f459202b.png) ``` package main import ( "fmt" "github.com/360EntSecGroup-Skylar/excelize/v2" ) func main() { categories := map[string]string{"A2": "Small", "A3": "Normal", "A4": "Large", "B1": "Apple", "C1": "Orange", "D1": "Pear"} values := map[string]int{"B2": 2, "C2": 3, "D2": 3, "B3": 5, "C3": 2, "D3": 4, "B4": 6, "C4": 7, "D4": 8} f := excelize.NewFile() for k, v := range categories { f.SetCellValue("Sheet1", k, v) } for k, v := range values { f.SetCellValue("Sheet1", k, v) } err := f.AddChart("Sheet1", "E1", `{"type":"area3DStacked","series":[{"name":"Sheet1!$A$2","categories":"","values":"Sheet1!$B$2:$D$2"},{"name":"Sheet1!$A$3","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$3:$D$3"},{"name":"Sheet1!$A$4","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$4:$D$4"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"bottom","show_legend_key":false},"title":{"name":"Fruit 3D Stacked Area Chart"},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":true,"show_val":true},"show_blanks_as":"zero"}`) if err != nil { fmt.Println(err) } // 保存工作簿 err = f.SaveAs("./Book1.xlsx") if err != nil { fmt.Println(err) } } ``` ### 三维百分比堆积面积图 例如,创建如下效果的三维百分比堆积面积图: ![使用 Go 语言在 Excel 文档中创建三维百分比堆积面积图](https://www.xieys.club/images/posts/cf48a9c9d3eefefd15b13bd5d753004e.png) ![使用 Go 语言在 Excel 文档中创建三维百分比堆积面积图](https://www.xieys.club/images/posts/cf48a9c9d3eefefd15b13bd5d753004e.png) ``` package main import ( "fmt" "github.com/360EntSecGroup-Skylar/excelize/v2" ) func main() { categories := map[string]string{"A2": "Small", "A3": "Normal", "A4": "Large", "B1": "Apple", "C1": "Orange", "D1": "Pear"} values := map[string]int{"B2": 2, "C2": 3, "D2": 3, "B3": 5, "C3": 2, "D3": 4, "B4": 6, "C4": 7, "D4": 8} f := excelize.NewFile() for k, v := range categories { f.SetCellValue("Sheet1", k, v) } for k, v := range values { f.SetCellValue("Sheet1", k, v) } err := f.AddChart("Sheet1", "E1", `{"type":"area3DPercentStacked","series":[{"name":"Sheet1!$A$2","categories":"","values":"Sheet1!$B$2:$D$2"},{"name":"Sheet1!$A$3","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$3:$D$3"},{"name":"Sheet1!$A$4","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$4:$D$4"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"bottom","show_legend_key":false},"title":{"name":"Fruit 3D 100% Stacked Area Chart"},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":true,"show_val":true},"show_blanks_as":"zero"}`) if err != nil { fmt.Println(err) } // 保存工作簿 err = f.SaveAs("./Book1.xlsx") if err != nil { fmt.Println(err) } } ``` ### 二维簇状条形图 例如,创建如下效果的二维簇状条形图: ![使用 Go 语言在 Excel 文档中创建二维簇状条形图](https://www.xieys.club/images/posts/65d1de0148334802ca5a50a28a542160.png) ![使用 Go 语言在 Excel 文档中创建二维簇状条形图](https://www.xieys.club/images/posts/65d1de0148334802ca5a50a28a542160.png) ``` package main import ( "fmt" "github.com/360EntSecGroup-Skylar/excelize/v2" ) func main() { categories := map[string]string{"A2": "Small", "A3": "Normal", "A4": "Large", "B1": "Apple", "C1": "Orange", "D1": "Pear"} values := map[string]int{"B2": 2, "C2": 3, "D2": 3, "B3": 5, "C3": 2, "D3": 4, "B4": 6, "C4": 7, "D4": 8} f := excelize.NewFile() for k, v := range categories { f.SetCellValue("Sheet1", k, v) } for k, v := range values { f.SetCellValue("Sheet1", k, v) } err := f.AddChart("Sheet1", "E1", `{"type":"bar","series":[{"name":"Sheet1!$A$2","categories":"","values":"Sheet1!$B$2:$D$2"},{"name":"Sheet1!$A$3","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$3:$D$3"},{"name":"Sheet1!$A$4","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$4:$D$4"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"left","show_legend_key":false},"title":{"name":"Fruit 2D Clustered Bar Chart"},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":true,"show_val":true},"show_blanks_as":"zero"}`) if err != nil { fmt.Println(err) } // 保存工作簿 err = f.SaveAs("./Book1.xlsx") if err != nil { fmt.Println(err) } } ``` ### 二维堆积条形图 例如,创建如下效果的二维堆积条形图: ![使用 Go 语言在 Excel 文档中创建二维堆积条形图](https://www.xieys.club/images/posts/6300c3be6054214fe9cb2337885e2ec3.png) ![使用 Go 语言在 Excel 文档中创建二维堆积条形图](https://www.xieys.club/images/posts/6300c3be6054214fe9cb2337885e2ec3.png) ``` package main import ( "fmt" "github.com/360EntSecGroup-Skylar/excelize/v2" ) func main() { categories := map[string]string{"A2": "Small", "A3": "Normal", "A4": "Large", "B1": "Apple", "C1": "Orange", "D1": "Pear"} values := map[string]int{"B2": 2, "C2": 3, "D2": 3, "B3": 5, "C3": 2, "D3": 4, "B4": 6, "C4": 7, "D4": 8} f := excelize.NewFile() for k, v := range categories { f.SetCellValue("Sheet1", k, v) } for k, v := range values { f.SetCellValue("Sheet1", k, v) } err := f.AddChart("Sheet1", "E1", `{"type":"barStacked","series":[{"name":"Sheet1!$A$2","categories":"","values":"Sheet1!$B$2:$D$2"},{"name":"Sheet1!$A$3","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$3:$D$3"},{"name":"Sheet1!$A$4","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$4:$D$4"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"left","show_legend_key":false},"title":{"name":"Fruit 2D Stacked Bar Chart"},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":true,"show_val":true},"show_blanks_as":"zero"}`) if err != nil { fmt.Println(err) } // 保存工作簿 err = f.SaveAs("./Book1.xlsx") if err != nil { fmt.Println(err) } } ``` ### 二维百分比堆积条形图 例如,创建如下效果的二维百分比堆积条形图: ![使用 Go 语言在 Excel 文档中创建二维百分比堆积条形图](https://www.xieys.club/images/posts/d79a8a12a58f8df8f10497f148588287.png) ![使用 Go 语言在 Excel 文档中创建二维百分比堆积条形图](https://www.xieys.club/images/posts/d79a8a12a58f8df8f10497f148588287.png) ``` package main import ( "fmt" "github.com/360EntSecGroup-Skylar/excelize/v2" ) func main() { categories := map[string]string{"A2": "Small", "A3": "Normal", "A4": "Large", "B1": "Apple", "C1": "Orange", "D1": "Pear"} values := map[string]int{"B2": 2, "C2": 3, "D2": 3, "B3": 5, "C3": 2, "D3": 4, "B4": 6, "C4": 7, "D4": 8} f := excelize.NewFile() for k, v := range categories { f.SetCellValue("Sheet1", k, v) } for k, v := range values { f.SetCellValue("Sheet1", k, v) } err := f.AddChart("Sheet1", "E1", `{"type":"barPercentStacked","series":[{"name":"Sheet1!$A$2","categories":"","values":"Sheet1!$B$2:$D$2"},{"name":"Sheet1!$A$3","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$3:$D$3"},{"name":"Sheet1!$A$4","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$4:$D$4"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"left","show_legend_key":false},"title":{"name":"Fruit 2D Stacked 100% Bar Chart"},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":true,"show_val":true},"show_blanks_as":"zero"}`) if err != nil { fmt.Println(err) } // 保存工作簿 err = f.SaveAs("./Book1.xlsx") if err != nil { fmt.Println(err) } } ``` ### 三维簇状条形图 例如,创建如下效果的三维簇状条形图: ![使用 Go 语言在 Excel 文档中创建三维簇状条形图](https://www.xieys.club/images/posts/03410ea1b1be72912a558e8aadb485c2.png) ![使用 Go 语言在 Excel 文档中创建三维簇状条形图](https://www.xieys.club/images/posts/03410ea1b1be72912a558e8aadb485c2.png) ``` package main import ( "fmt" "github.com/360EntSecGroup-Skylar/excelize/v2" ) func main() { categories := map[string]string{"A2": "Small", "A3": "Normal", "A4": "Large", "B1": "Apple", "C1": "Orange", "D1": "Pear"} values := map[string]int{"B2": 2, "C2": 3, "D2": 3, "B3": 5, "C3": 2, "D3": 4, "B4": 6, "C4": 7, "D4": 8} f := excelize.NewFile() for k, v := range categories { f.SetCellValue("Sheet1", k, v) } for k, v := range values { f.SetCellValue("Sheet1", k, v) } err := f.AddChart("Sheet1", "E1", `{"type":"bar3DClustered","series":[{"name":"Sheet1!$A$2","categories":"","values":"Sheet1!$B$2:$D$2"},{"name":"Sheet1!$A$3","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$3:$D$3"},{"name":"Sheet1!$A$4","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$4:$D$4"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"left","show_legend_key":false},"title":{"name":"Fruit 3D Clustered Bar Chart"},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":true,"show_val":true},"show_blanks_as":"zero"}`) if err != nil { fmt.Println(err) } // 保存工作簿 err = f.SaveAs("./Book1.xlsx") if err != nil { fmt.Println(err) } } ``` ### 三维堆积条形图 例如,创建如下效果的三维堆积条形图: ![使用 Go 语言在 Excel 文档中创建三维堆积条形图](https://www.xieys.club/images/posts/87975753f44183dde6f8a7ab47247902.png) ![使用 Go 语言在 Excel 文档中创建三维堆积条形图](https://www.xieys.club/images/posts/87975753f44183dde6f8a7ab47247902.png) ``` package main import ( "fmt" "github.com/360EntSecGroup-Skylar/excelize/v2" ) func main() { categories := map[string]string{"A2": "Small", "A3": "Normal", "A4": "Large", "B1": "Apple", "C1": "Orange", "D1": "Pear"} values := map[string]int{"B2": 2, "C2": 3, "D2": 3, "B3": 5, "C3": 2, "D3": 4, "B4": 6, "C4": 7, "D4": 8} f := excelize.NewFile() for k, v := range categories { f.SetCellValue("Sheet1", k, v) } for k, v := range values { f.SetCellValue("Sheet1", k, v) } err := f.AddChart("Sheet1", "E1", `{"type":"bar3DStacked","series":[{"name":"Sheet1!$A$2","categories":"","values":"Sheet1!$B$2:$D$2"},{"name":"Sheet1!$A$3","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$3:$D$3"},{"name":"Sheet1!$A$4","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$4:$D$4"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"left","show_legend_key":false},"title":{"name":"Fruit 3D Stacked Bar Chart"},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":true,"show_val":true},"show_blanks_as":"zero"}`) if err != nil { fmt.Println(err) } // 保存工作簿 err = f.SaveAs("./Book1.xlsx") if err != nil { fmt.Println(err) } } ``` ### 三维百分比堆积条形图 例如,创建如下效果的三维百分比堆积条形图: ![使用 Go 语言在 Excel 文档中创建三维百分比堆积条形图](https://www.xieys.club/images/posts/2702c790e4df75511ba4f8d0bb7261d1.png) ![使用 Go 语言在 Excel 文档中创建三维百分比堆积条形图](https://www.xieys.club/images/posts/2702c790e4df75511ba4f8d0bb7261d1.png) ``` package main import ( "fmt" "github.com/360EntSecGroup-Skylar/excelize/v2" ) func main() { categories := map[string]string{"A2": "Small", "A3": "Normal", "A4": "Large", "B1": "Apple", "C1": "Orange", "D1": "Pear"} values := map[string]int{"B2": 2, "C2": 3, "D2": 3, "B3": 5, "C3": 2, "D3": 4, "B4": 6, "C4": 7, "D4": 8} f := excelize.NewFile() for k, v := range categories { f.SetCellValue("Sheet1", k, v) } for k, v := range values { f.SetCellValue("Sheet1", k, v) } err := f.AddChart("Sheet1", "E1", `{"type":"bar3DPercentStacked","series":[{"name":"Sheet1!$A$2","categories":"","values":"Sheet1!$B$2:$D$2"},{"name":"Sheet1!$A$3","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$3:$D$3"},{"name":"Sheet1!$A$4","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$4:$D$4"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"left","show_legend_key":false},"title":{"name":"Fruit 3D 100% Stacked Bar Chart"},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":true,"show_val":true},"show_blanks_as":"zero"}`) if err != nil { fmt.Println(err) } // 保存工作簿 err = f.SaveAs("./Book1.xlsx") if err != nil { fmt.Println(err) } } ``` ### 二维簇状柱形图 例如,创建如下效果的二维簇状柱形图: ![使用 Go 语言在 Excel 文档中创建二维簇状柱形图](https://www.xieys.club/images/posts/78c8332baa86143f6d69f56f56f29d2d.png) ![使用 Go 语言在 Excel 文档中创建二维簇状柱形图](https://www.xieys.club/images/posts/78c8332baa86143f6d69f56f56f29d2d.png) ``` package main import ( "fmt" "github.com/360EntSecGroup-Skylar/excelize/v2" ) func main() { categories := map[string]string{"A2": "Small", "A3": "Normal", "A4": "Large", "B1": "Apple", "C1": "Orange", "D1": "Pear"} values := map[string]int{"B2": 2, "C2": 3, "D2": 3, "B3": 5, "C3": 2, "D3": 4, "B4": 6, "C4": 7, "D4": 8} f := excelize.NewFile() for k, v := range categories { f.SetCellValue("Sheet1", k, v) } for k, v := range values { f.SetCellValue("Sheet1", k, v) } err := f.AddChart("Sheet1", "E1", `{"type":"col","series":[{"name":"Sheet1!$A$2","categories":"","values":"Sheet1!$B$2:$D$2"},{"name":"Sheet1!$A$3","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$3:$D$3"},{"name":"Sheet1!$A$4","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$4:$D$4"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"left","show_legend_key":false},"title":{"name":"Fruit 2D Column Chart"},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":true,"show_val":true},"show_blanks_as":"zero"}`) if err != nil { fmt.Println(err) } // 保存工作簿 err = f.SaveAs("./Book1.xlsx") if err != nil { fmt.Println(err) } } ``` ### 三维簇状柱形图 例如,创建如下效果的三维簇状柱形图: ![使用 Go 语言在 Excel 文档中创建三维簇状柱形图](https://www.xieys.club/images/posts/a5f2adbcca7a140527723a6f2910937b.png) ![使用 Go 语言在 Excel 文档中创建三维簇状柱形图](https://www.xieys.club/images/posts/a5f2adbcca7a140527723a6f2910937b.png) ``` package main import ( "fmt" "github.com/360EntSecGroup-Skylar/excelize" ) func main() { categories := map[string]string{"A2": "Small", "A3": "Normal", "A4": "Large", "B1": "Apple", "C1": "Orange", "D1": "Pear"} values := map[string]int{"B2": 2, "C2": 3, "D2": 3, "B3": 5, "C3": 2, "D3": 4, "B4": 6, "C4": 7, "D4": 8} f := excelize.NewFile() for k, v := range categories { f.SetCellValue("Sheet1", k, v) } for k, v := range values { f.SetCellValue("Sheet1", k, v) } err := f.AddChart("Sheet1", "E1", `{"type":"col3DClustered","series":[{"name":"Sheet1!$A$2","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$2:$D$2"},{"name":"Sheet1!$A$3","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$3:$D$3"},{"name":"Sheet1!$A$4","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$4:$D$4"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"bottom","show_legend_key":false},"title":{"name":"Fruit 3D Clustered Column Chart"},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":true,"show_val":true},"show_blanks_as":"zero","x_axis":{"reverse_order":true},"y_axis":{"maximum":7.5,"minimum":0.5}}`) if err != nil { fmt.Println(err) } // 保存工作簿 err = f.SaveAs("./Book1.xlsx") if err != nil { fmt.Println(err) } } ``` ### 圆环图 例如,创建如下效果的圆环图: ![使用 Go 语言在 Excel 文档中创建圆环图](https://www.xieys.club/images/posts/96bc74a7e96a88615c1c77e052a06b57.png) ![使用 Go 语言在 Excel 文档中创建圆环图](https://www.xieys.club/images/posts/96bc74a7e96a88615c1c77e052a06b57.png) ``` package main import ( "fmt" "github.com/360EntSecGroup-Skylar/excelize/v2" ) func main() { categories := map[string]string{"A1": "Apple", "B1": "Orange", "C1": "Pear"} values := map[string]int{"A2": 2, "B2": 3, "C2": 3} f := excelize.NewFile() for k, v := range categories { f.SetCellValue("Sheet1", k, v) } for k, v := range values { f.SetCellValue("Sheet1", k, v) } err := f.AddChart("Sheet1", "E1", `{"type":"doughnut","series":[{"name":"Sheet1!$A$2","categories":"Sheet1!$A$1:$C$1","values":"Sheet1!$A$2:$C$2"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"right","show_legend_key":false},"title":{"name":"Fruit Doughnut Chart"},"plotarea":{"show_bubble_size":false,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":false,"show_val":false},"show_blanks_as":"zero"}`) if err != nil { fmt.Println(err) } // 保存工作簿 err = f.SaveAs("./Book1.xlsx") if err != nil { fmt.Println(err) } } ``` ### 折线图 例如,创建如下效果的折线图: ![使用 Go 语言在 Excel 文档中创建折线图](https://www.xieys.club/images/posts/2933fdd46a2f8930307e49409570a05f.png) ![使用 Go 语言在 Excel 文档中创建折线图](https://www.xieys.club/images/posts/2933fdd46a2f8930307e49409570a05f.png) ``` package main import ( "fmt" "github.com/360EntSecGroup-Skylar/excelize/v2" ) func main() { categories := map[string]string{"A2": "Small", "A3": "Normal", "A4": "Large", "B1": "Apple", "C1": "Orange", "D1": "Pear"} values := map[string]int{"B2": 2, "C2": 3, "D2": 3, "B3": 5, "C3": 2, "D3": 4, "B4": 6, "C4": 7, "D4": 8} f := excelize.NewFile() for k, v := range categories { f.SetCellValue("Sheet1", k, v) } for k, v := range values { f.SetCellValue("Sheet1", k, v) } f.AddChart("Sheet1", "E1", `{"type":"line","series":[{"name":"Sheet1!$A$2","categories":"","values":"Sheet1!$B$2:$D$2"},{"name":"Sheet1!$A$3","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$3:$D$3"},{"name":"Sheet1!$A$4","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$4:$D$4"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"top","show_legend_key":false},"title":{"name":"Fruit Line Chart"},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":true,"show_val":true},"show_blanks_as":"zero"}`) // 保存工作簿 err := f.SaveAs("./Book1.xlsx") if err != nil { fmt.Println(err) } } ``` ### 饼图 例如,创建如下效果的饼图: ![使用 Go 语言在 Excel 文档中创建饼图](https://www.xieys.club/images/posts/a8606167fed4e457f4289f9681a57431.png) ![使用 Go 语言在 Excel 文档中创建饼图](https://www.xieys.club/images/posts/a8606167fed4e457f4289f9681a57431.png) ``` package main import ( "fmt" "github.com/360EntSecGroup-Skylar/excelize/v2" ) func main() { categories := map[string]string{"A2": "Small", "A3": "Normal", "A4": "Large", "B1": "Apple", "C1": "Orange", "D1": "Pear"} values := map[string]int{"B2": 2, "C2": 3, "D2": 3, "B3": 5, "C3": 2, "D3": 4, "B4": 6, "C4": 7, "D4": 8} f := excelize.NewFile() for k, v := range categories { f.SetCellValue("Sheet1", k, v) } for k, v := range values { f.SetCellValue("Sheet1", k, v) } f.AddChart("Sheet1", "E1", `{"type":"pie","series":[{"name":"Sheet1!$A$2","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$2:$D$2"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"bottom","show_legend_key":false},"title":{"name":"Fruit Pie Chart"},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":false,"show_val":false},"show_blanks_as":"gap"}`) // 保存工作簿 err := f.SaveAs("./Book1.xlsx") if err != nil { fmt.Println(err) } } ``` ### 三维饼图 例如,创建如下效果的三维饼图: ![使用 Go 语言在 Excel 文档中创建三维饼图](https://www.xieys.club/images/posts/8edff773df95d7c48e40c756d22e503e.png) ![使用 Go 语言在 Excel 文档中创建三维饼图](https://www.xieys.club/images/posts/8edff773df95d7c48e40c756d22e503e.png) ``` package main import ( "fmt" "github.com/360EntSecGroup-Skylar/excelize/v2" ) func main() { categories := map[string]string{"A2": "Small", "A3": "Normal", "A4": "Large", "B1": "Apple", "C1": "Orange", "D1": "Pear"} values := map[string]int{"B2": 2, "C2": 3, "D2": 3, "B3": 5, "C3": 2, "D3": 4, "B4": 6, "C4": 7, "D4": 8} f := excelize.NewFile() for k, v := range categories { f.SetCellValue("Sheet1", k, v) } for k, v := range values { f.SetCellValue("Sheet1", k, v) } f.AddChart("Sheet1", "E1", `{"type":"pie3D","series":[{"name":"Sheet1!$A$2","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$2:$D$2"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"bottom","show_legend_key":false},"title":{"name":"Fruit 3D Pie Chart"},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":false,"show_val":false},"show_blanks_as":"zero"}`) // 保存工作簿 err := f.SaveAs("./Book1.xlsx") if err != nil { fmt.Println(err) } } ``` ### 雷达图 例如,创建如下效果的雷达图: ![使用 Go 语言在 Excel 文档中创建雷达图](https://www.xieys.club/images/posts/2abf5c850451092a1b65255b815f7eb3.png) ![使用 Go 语言在 Excel 文档中创建雷达图](https://www.xieys.club/images/posts/2abf5c850451092a1b65255b815f7eb3.png) ``` package main import ( "fmt" "github.com/360EntSecGroup-Skylar/excelize/v2" ) func main() { categories := map[string]string{"A2": "Small", "A3": "Normal", "A4": "Large", "B1": "Apple", "C1": "Orange", "D1": "Pear"} values := map[string]int{"B2": 2, "C2": 3, "D2": 3, "B3": 5, "C3": 2, "D3": 4, "B4": 6, "C4": 7, "D4": 8} f := excelize.NewFile() for k, v := range categories { f.SetCellValue("Sheet1", k, v) } for k, v := range values { f.SetCellValue("Sheet1", k, v) } err := f.AddChart("Sheet1", "E1", `{"type":"radar","series":[{"name":"Sheet1!$A$2","categories":"","values":"Sheet1!$B$2:$D$2"},{"name":"Sheet1!$A$3","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$3:$D$3"},{"name":"Sheet1!$A$4","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$4:$D$4"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"top","show_legend_key":false},"title":{"name":"Fruit Radar Chart"},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":false,"show_val":false},"show_blanks_as":"span"}`) if err != nil { fmt.Println(err) } // 保存工作簿 err = f.SaveAs("./Book1.xlsx") if err != nil { fmt.Println(err) } } ``` ### 散点图 例如,创建如下效果的散点图: ![使用 Go 语言在 Excel 文档中创建散点图](https://www.xieys.club/images/posts/6dec4cbd38a564be3c2cb50c1c1d60af.png) ![使用 Go 语言在 Excel 文档中创建散点图](https://www.xieys.club/images/posts/6dec4cbd38a564be3c2cb50c1c1d60af.png) ``` package main import ( "fmt" "github.com/360EntSecGroup-Skylar/excelize/v2" ) func main() { categories := map[string]string{"A2": "Small", "A3": "Normal", "A4": "Large", "B1": "Apple", "C1": "Orange", "D1": "Pear"} values := map[string]int{"B2": 2, "C2": 3, "D2": 3, "B3": 5, "C3": 2, "D3": 4, "B4": 6, "C4": 7, "D4": 8} f := excelize.NewFile() for k, v := range categories { f.SetCellValue("Sheet1", k, v) } for k, v := range values { f.SetCellValue("Sheet1", k, v) } err := f.AddChart("Sheet1", "E1", `{"type":"scatter","series":[{"name":"Sheet1!$A$2","categories":"","values":"Sheet1!$B$2:$D$2"},{"name":"Sheet1!$A$3","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$3:$D$3"},{"name":"Sheet1!$A$4","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$4:$D$4"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"left","show_legend_key":false},"title":{"name":"Fruit Scatter Chart"},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":true,"show_val":true},"show_blanks_as":"zero"}`) if err != nil { fmt.Println(err) } // 保存工作簿 err = f.SaveAs("./Book1.xlsx") if err != nil { fmt.Println(err) } } ``` ## 图片 ### 插入图片 ``` func (f *File)AddPicture(sheet, cell, picture, format string) error ``` 根据给定的工作表名称、单元格坐标、图片地址和图片格式(例如偏移、缩放和打印设置等),在对应的单元格上插入图片。 例如: ``` package main import( "fmt" _ "image/gif" _ "image/jpeg" _ "image/png" "github.com/360EntSecGroup-Skylar/excelize/v2" ) func main(){ f := excelize.NewFile() // 插入图片 err := f.AddPicture("Sheet1","A2","./image1.jpg","") if err !=nil{ fmt.Println(err) } // 插入带有缩放比例和超链接的图片 err = f.AddPicture("Sheet1","D2","./image1.png",`{"x_scale": 0.5, "y_scale": 0.5, "hyperlink": "#Sheet2!D8", "hyperlink_type": "Location"}`) if err !=nil{ fmt.Println(err) } // 插入图片,并设置图片的外部超链接、打印和位置属性 err = f.AddPicture("Sheet1","H2","./image3.gif",`{"x_offset": 15, "y_offset": 10, "hyperlink": "https://github.com/360EntSecGroup-Skylar/excelize", "hyperlink_type": "External", "print_obj": true, "lock_aspect_ratio": false, "locked": false, "positioning": "oneCell"}`) if err !=nil{ fmt.Println(err) } err = f.SaveAs("./Book1.xlsx") if err !=nil{ fmt.Println(err) } } ``` 链接类型 `hyperlink_type` 支持外部链接 `External` 和内部链接 `Location` 两种类型,当使用 `Location` 连接到单元格位置时,坐标需要以 `#` 开始。 位置属性 `positioning` 支持 `oneCell`(大小固定,位置随单元格改变)和 `absolute` (大小、位置均固定)两种类型,当不设置此参数时,默认属性为大小、位置随单元格而改变。 ``` func (f *File)AddPictureFromBytes(sheet, cell, format, name, extension string, file []byte) error ``` 根据给定的工作表名称、单元格坐标、图片地址和图片格式(例如偏移、缩放和打印设置等)、图片描述、图片扩展名和 `[]byte` 类型的图片内容,在对应的单元格上插入图片。 例如: ``` package main import( "fmt" _ "image/jpeg" "io/ioutil" "github.com/360EntSecGroup-Skylar/excelize" ) func main(){ f := excelize.NewFile() file, err := ioutil.ReadFile("./image1.jpg") if err !=nil{ fmt.Println(err) } err = f.AddPictureFromBytes("Sheet1","A2","","Excel Logo",".jpg", file) if err !=nil{ fmt.Println(err) } err = f.SaveAs("./Book1.xlsx") if err !=nil{ fmt.Println(err) } } ``` ### 获取图片 ``` func (f *File) GetPicture(sheet, cell string) (string, []byte, error) ``` 根据给定的工作表名称(大小写敏感)和单元格坐标获取工作簿上的图片,将以 `[]byte` 类型返回嵌入在 Excel 文档中的图片。例如,获取名为 `Sheet1` 的工作表上 `A2` 单元格上的图片: ``` f, err := excelize.OpenFile("./Book1.xlsx") if err != nil { fmt.Println(err) return } file, raw, err := f.GetPicture("Sheet1", "A2") if err != nil { fmt.Println(err) return } err = ioutil.WriteFile(file, raw, 0644) if err != nil { fmt.Println(err) } ``` ## 形状 ## 添加形状 ``` func (f *File) AddShape(sheet, cell, format string) error ``` 根据给定的工作表名、单元格坐标和样式(包括偏移、缩放、拉伸、宽高比和打印属性等)在指定单元格添加形状。例如,在名为 `Sheet1` 的工作表上添加文本框(矩形): ``` err := f.AddShape("Sheet1", "G6", `{"type":"rect","color":{"line":"#4286F4","fill":"#8eb9ff"},"paragraph":[{"text":"Rectangle Shape","font":{"bold":true,"italic":true,"family":"Berlin Sans FB Demi","size":36,"color":"#777777","underline":"sng"}}],"width":180,"height": 90}`) ``` 下面是 Excelize 所支持的所有形状: | 名称 | 形状 | | :------------------------- | :----------------------------------------- | | accentBorderCallout1 | Callout 1 with Border and Accent Shape | | accentBorderCallout2 | Callout 2 with Border and Accent Shape | | accentBorderCallout3 | Callout 3 with Border and Accent Shape | | accentCallout1 | Callout 1 Shape | | accentCallout2 | Callout 2 Shape | | accentCallout3 | Callout 3 Shape | | actionButtonBackPrevious | Back or Previous Button Shape | | actionButtonBeginning | Beginning Button Shape | | actionButtonBlank | Blank Button Shape | | actionButtonDocument | Document Button Shape | | actionButtonEnd | End Button Shape | | actionButtonForwardNext | Forward or Next Button Shape | | actionButtonHelp | Help Button Shape | | actionButtonHome | Home Button Shape | | actionButtonInformation | Information Button Shape | | actionButtonMovie | Movie Button Shape | | actionButtonReturn | Return Button Shape | | actionButtonSound | Sound Button Shape | | arc | Curved Arc Shape | | bentArrow | Bent Arrow Shape | | bentConnector2 | Bent Connector 2 Shape | | bentConnector3 | Bent Connector 3 Shape | | bentConnector4 | Bent Connector 4 Shape | | bentConnector5 | Bent Connector 5 Shape | | bentUpArrow | Bent Up Arrow Shape | | bevel | Bevel Shape | | blockArc | Block Arc Shape | | borderCallout1 | Callout 1 with Border Shape | | borderCallout2 | Callout 2 with Border Shape | | borderCallout3 | Callout 3 with Border Shape | | bracePair | Brace Pair Shape | | bracketPair | Bracket Pair Shape | | callout1 | Callout 1 Shape | | callout2 | Callout 2 Shape | | callout3 | Callout 3 Shape | | can | Can Shape | | chartPlus | Chart Plus Shape | | chartStar | Chart Star Shape | | chartX | Chart X Shape | | chevron | Chevron Shape | | chord | Chord Shape | | circularArrow | Circular Arrow Shape | | cloud | Cloud Shape | | cloudCallout | Callout Cloud Shape | | corner | Corner Shape | | cornerTabs | Corner Tabs Shape | | cube | Cube Shape | | curvedConnector2 | Curved Connector 2 Shape | | curvedConnector3 | Curved Connector 3 Shape | | curvedConnector4 | Curved Connector 4 Shape | | curvedConnector5 | Curved Connector 5 Shape | | curvedDownArrow | Curved Down Arrow Shape | | curvedLeftArrow | Curved Left Arrow Shape | | curvedRightArrow | Curved Right Arrow Shape | | curvedUpArrow | Curved Up Arrow Shape | | decagon | Decagon Shape | | diagStripe | Diagonal Stripe Shape | | diamond | Diamond Shape | | dodecagon | Dodecagon Shape | | donut | Donut Shape | | doubleWave | Double Wave Shape | | downArrow | Down Arrow Shape | | downArrowCallout | Callout Down Arrow Shape | | ellipse | Ellipse Shape | | ellipseRibbon | Ellipse Ribbon Shape | | ellipseRibbon2 | Ellipse Ribbon 2 Shape | | flowChartAlternateProcess | Alternate Process Flow Shape | | flowChartCollate | Collate Flow Shape | | flowChartConnector | Connector Flow Shape | | flowChartDecision | Decision Flow Shape | | flowChartDelay | Delay Flow Shape | | flowChartDisplay | Display Flow Shape | | flowChartDocument | Document Flow Shape | | flowChartExtract | Extract Flow Shape | | flowChartInputOutput | Input Output Flow Shape | | flowChartInternalStorage | Internal Storage Flow Shape | | flowChartMagneticDisk | Magnetic Disk Flow Shape | | flowChartMagneticDrum | Magnetic Drum Flow Shape | | flowChartMagneticTape | Magnetic Tape Flow Shape | | flowChartManualInput | Manual Input Flow Shape | | flowChartManualOperation | Manual Operation Flow Shape | | flowChartMerge | Merge Flow Shape | | flowChartMultidocument | Multi-Document Flow Shape | | flowChartOfflineStorage | Offline Storage Flow Shape | | flowChartOffpageConnector | Off-Page Connector Flow Shape | | flowChartOnlineStorage | Online Storage Flow Shape | | flowChartOr | Or Flow Shape | | flowChartPredefinedProcess | Predefined Process Flow Shape | | flowChartPreparation | Preparation Flow Shape | | flowChartProcess | Process Flow Shape | | flowChartPunchedCard | Punched Card Flow Shape | | flowChartPunchedTape | Punched Tape Flow Shape | | flowChartSort | Sort Flow Shape | | flowChartSummingJunction | Summing Junction Flow Shape | | flowChartTerminator | Terminator Flow Shape | | foldedCorner | Folded Corner Shape | | frame | Frame Shape | | funnel | Funnel Shape | | gear6 | Gear 6 Shape | | gear9 | Gear 9 Shape | | halfFrame | Half Frame Shape | | heart | Heart Shape | | heptagon | Heptagon Shape | | hexagon | Hexagon Shape | | homePlate | Home Plate Shape | | horizontalScroll | Horizontal Scroll Shape | | irregularSeal1 | Irregular Seal 1 Shape | | irregularSeal2 | Irregular Seal 2 Shape | | leftArrow | Left Arrow Shape | | leftArrowCallout | Callout Left Arrow Shape | | leftBrace | Left Brace Shape | | leftBracket | Left Bracket Shape | | leftCircularArrow | Left Circular Arrow Shape | | leftRightArrow | Left Right Arrow Shape | | leftRightArrowCallout | Callout Left Right Arrow Shape | | leftRightCircularArrow | Left Right Circular Arrow Shape | | leftRightRibbon | Left Right Ribbon Shape | | leftRightUpArrow | Left Right Up Arrow Shape | | leftUpArrow | Left Up Arrow Shape | | lightningBolt | Lightning Bolt Shape | | line | Line Shape | | lineInv | Line Inverse Shape | | mathDivide | Divide Math Shape | | mathEqual | Equal Math Shape | | mathMinus | Minus Math Shape | | mathMultiply | Multiply Math Shape | | mathNotEqual | Not Equal Math Shape | | mathPlus | Plus Math Shape | | moon | Moon Shape | | nonIsoscelesTrapezoid | Non-Isosceles Trapezoid Shape | | noSmoking | No Smoking Shape | | notchedRightArrow | Notched Right Arrow Shape | | octagon | Octagon Shape | | parallelogram | Parallelogram Shape | | pentagon | Pentagon Shape | | pie | Pie Shape | | pieWedge | Pie Wedge Shape | | plaque | Plaque Shape | | plaqueTabs | Plaque Tabs Shape | | plus | Plus Shape | | quadArrow | Quad-Arrow Shape | | quadArrowCallout | Callout Quad-Arrow Shape | | rect | Rectangle Shape | | ribbon | Ribbon Shape | | ribbon2 | Ribbon 2 Shape | | rightArrow | Right Arrow Shape | | rightArrowCallout | Callout Right Arrow Shape | | rightBrace | Right Brace Shape | | rightBracket | Right Bracket Shape | | round1Rect | One Round Corner Rectangle Shape | | round2DiagRect | Two Diagonal Round Corner Rectangle Shape | | round2SameRect | Two Same-side Round Corner Rectangle Shape | | roundRect | Round Corner Rectangle Shape | | rtTriangle | Right Triangle Shape | | smileyFace | Smiley Face Shape | | snip1Rect | One Snip Corner Rectangle Shape | | snip2DiagRect | Two Diagonal Snip Corner Rectangle Shape | | snip2SameRect | Two Same-side Snip Corner Rectangle Shape | | snipRoundRect | One Snip One Round Corner Rectangle Shape | | squareTabs | Square Tabs Shape | | star10 | Ten Pointed Star Shape | | star12 | Twelve Pointed Star Shape | | star16 | Sixteen Pointed Star Shape | | star24 | Twenty Four Pointed Star Shape | | star32 | Thirty Two Pointed Star Shape | | star4 | Four Pointed Star Shape | | star5 | Five Pointed Star Shape | | star6 | Six Pointed Star Shape | | star7 | Seven Pointed Star Shape | | star8 | Eight Pointed Star Shape | | straightConnector1 | Straight Connector 1 Shape | | stripedRightArrow | Striped Right Arrow Shape | | sun | Sun Shape | | swooshArrow | Swoosh Arrow Shape | | teardrop | Teardrop Shape | | trapezoid | Trapezoid Shape | | triangle | Triangle Shape | | upArrow | Up Arrow Shape | | upArrowCallout | Callout Up Arrow Shape | | upDownArrow | Up Down Arrow Shape | | upDownArrowCallout | Callout Up Down Arrow Shape | | uturnArrow | U-Turn Arrow Shape | | verticalScroll | Vertical Scroll Shape | | wave | Wave Shape | | wedgeEllipseCallout | Callout Wedge Ellipse Shape | | wedgeRectCallout | Callout Wedge Rectangle Shape | | wedgeRoundRectCallout | Callout Wedge Round Rectangle Shape | ## 样式 ### 创建样式 ``` func (f *File) NewStyle(style string) (int, error) ``` 通过给定的样式格式创建样式并返回样式索引。请注意,颜色需要使用 RGB 色域代码表示。 ### 边框 下面的表格是 Excelize 中的边框样式索引 `type` 和对应的边框线条样式: | 索引 | 线条样式 | 粗细 | 预览效果 | | :--- | :--------------------- | :--- | :----------------------------------------------------------- | | 0 | 无 | 0 | | | 1 | 连续线 | 1 | !["连续线"](https://www.xieys.club/images/posts/3c979d487ca1ca60a5ec1c6d0837f322.png) | | 1 | 连续线 | 1 | !["连续线"](https://www.xieys.club/images/posts/3c979d487ca1ca60a5ec1c6d0837f322.png) | | 2 | 连续线 | 2 | !["连续线"](https://www.xieys.club/images/posts/18bcb24845b5ae15d02fa913d90311f0.png) | | 2 | 连续线 | 2 | !["连续线"](https://www.xieys.club/images/posts/18bcb24845b5ae15d02fa913d90311f0.png) | | 3 | 短线 | 1 | !["短线"](https://www.xieys.club/images/posts/ed64ed5c94b641b6c4ccd8ba696c36ce.png) | | 3 | 短线 | 1 | !["短线"](https://www.xieys.club/images/posts/ed64ed5c94b641b6c4ccd8ba696c36ce.png) | | 4 | 点线 | 1 | !["点线"](https://www.xieys.club/images/posts/07ead3cc1253aa0245bc8730c198b575.png) | | 4 | 点线 | 1 | !["点线"](https://www.xieys.club/images/posts/07ead3cc1253aa0245bc8730c198b575.png) | | 5 | 连续线 | 3 | !["连续线"](https://www.xieys.club/images/posts/ef091355b2941e02c9195f8d89383c8d.png) | | 5 | 连续线 | 3 | !["连续线"](https://www.xieys.club/images/posts/ef091355b2941e02c9195f8d89383c8d.png) | | 6 | 双线 | 3 | !["双线"](https://www.xieys.club/images/posts/f77fcdb8d0333143ba7cd637b573b816.png) | | 6 | 双线 | 3 | !["双线"](https://www.xieys.club/images/posts/f77fcdb8d0333143ba7cd637b573b816.png) | | 7 | 连续线 | 0 | !["连续线"](https://www.xieys.club/images/posts/399b6d9f6ef8c8ab8c23ab8bd86cfb2e.png) | | 7 | 连续线 | 0 | !["连续线"](https://www.xieys.club/images/posts/399b6d9f6ef8c8ab8c23ab8bd86cfb2e.png) | | 8 | 短线 | 2 | !["短线"](https://www.xieys.club/images/posts/a1187b1bb730e7a98e3aa4428398d6bf.png) | | 8 | 短线 | 2 | !["短线"](https://www.xieys.club/images/posts/a1187b1bb730e7a98e3aa4428398d6bf.png) | | 9 | 短线与点间隔线 | 1 | !["短线与点间隔线"](https://www.xieys.club/images/posts/e0afe8208667e6d706d631f35dce90f9.png) | | 9 | 短线与点间隔线 | 1 | !["短线与点间隔线"](https://www.xieys.club/images/posts/e0afe8208667e6d706d631f35dce90f9.png) | | 10 | 短线与点间隔线 | 2 | !["短线与点间隔线"](https://www.xieys.club/images/posts/451cd548dd9a3ee6caed71fbaaaa1e1e.png) | | 10 | 短线与点间隔线 | 2 | !["短线与点间隔线"](https://www.xieys.club/images/posts/451cd548dd9a3ee6caed71fbaaaa1e1e.png) | | 11 | 短线与两个点一组重复线 | 1 | !["短线与两个点一组重复线"](https://www.xieys.club/images/posts/e4a68154170b5c82f888de2c9b7dbe9f.png) | | 11 | 短线与两个点一组重复线 | 1 | !["短线与两个点一组重复线"](https://www.xieys.club/images/posts/e4a68154170b5c82f888de2c9b7dbe9f.png) | | 12 | 短线与两个点一组重复线 | 2 | !["短线与两个点一组重复线"](https://www.xieys.club/images/posts/73dc1b5050ca276539c9292af8cf646f.png) | | 12 | 短线与两个点一组重复线 | 2 | !["短线与两个点一组重复线"](https://www.xieys.club/images/posts/73dc1b5050ca276539c9292af8cf646f.png) | | 13 | 斜线与点线 | 2 | !["斜线与点线"](https://www.xieys.club/images/posts/73ba3b39e23f1d15be409846c295159b.png) | | 13 | 斜线与点线 | 2 | !["斜线与点线"](https://www.xieys.club/images/posts/73ba3b39e23f1d15be409846c295159b.png) | Excelize 中的边框样式代码与 Office Excel 应用程序“设置单元格格式” - “边框”对话框中的关系对照: | 索引 | 预览效果 | 索引 | 预览效果 | | :--- | :----------------------------------------------------------- | :--- | :----------------------------------------------------------- | | 0 | | 12 | !["边框 12"](https://www.xieys.club/images/posts/73dc1b5050ca276539c9292af8cf646f.png) | | 0 | | 12 | !["边框 12"](https://www.xieys.club/images/posts/73dc1b5050ca276539c9292af8cf646f.png) | | 7 | !["边框 7"](https://www.xieys.club/images/posts/399b6d9f6ef8c8ab8c23ab8bd86cfb2e.png) | 13 | !["边框 13"](https://www.xieys.club/images/posts/73ba3b39e23f1d15be409846c295159b.png) | | 7 | !["边框 7"](https://www.xieys.club/images/posts/399b6d9f6ef8c8ab8c23ab8bd86cfb2e.png) | 13 | !["边框 13"](https://www.xieys.club/images/posts/73ba3b39e23f1d15be409846c295159b.png) | | 7 | !["边框 7"](https://www.xieys.club/images/posts/399b6d9f6ef8c8ab8c23ab8bd86cfb2e.png) | 13 | !["边框 13"](https://www.xieys.club/images/posts/73ba3b39e23f1d15be409846c295159b.png) | | 7 | !["边框 7"](https://www.xieys.club/images/posts/399b6d9f6ef8c8ab8c23ab8bd86cfb2e.png) | 13 | !["边框 13"](https://www.xieys.club/images/posts/73ba3b39e23f1d15be409846c295159b.png) | | 4 | !["边框 4"](https://www.xieys.club/images/posts/07ead3cc1253aa0245bc8730c198b575.png) | 10 | !["边框 19"](https://www.xieys.club/images/posts/451cd548dd9a3ee6caed71fbaaaa1e1e.png) | | 4 | !["边框 4"](https://www.xieys.club/images/posts/07ead3cc1253aa0245bc8730c198b575.png) | 10 | !["边框 19"](https://www.xieys.club/images/posts/451cd548dd9a3ee6caed71fbaaaa1e1e.png) | | 4 | !["边框 4"](https://www.xieys.club/images/posts/07ead3cc1253aa0245bc8730c198b575.png) | 10 | !["边框 19"](https://www.xieys.club/images/posts/451cd548dd9a3ee6caed71fbaaaa1e1e.png) | | 4 | !["边框 4"](https://www.xieys.club/images/posts/07ead3cc1253aa0245bc8730c198b575.png) | 10 | !["边框 19"](https://www.xieys.club/images/posts/451cd548dd9a3ee6caed71fbaaaa1e1e.png) | | 11 | !["边框 11"](https://www.xieys.club/images/posts/e4a68154170b5c82f888de2c9b7dbe9f.png) | 8 | !["边框 8"](https://www.xieys.club/images/posts/a1187b1bb730e7a98e3aa4428398d6bf.png) | | 11 | !["边框 11"](https://www.xieys.club/images/posts/e4a68154170b5c82f888de2c9b7dbe9f.png) | 8 | !["边框 8"](https://www.xieys.club/images/posts/a1187b1bb730e7a98e3aa4428398d6bf.png) | | 11 | !["边框 11"](https://www.xieys.club/images/posts/e4a68154170b5c82f888de2c9b7dbe9f.png) | 8 | !["边框 8"](https://www.xieys.club/images/posts/a1187b1bb730e7a98e3aa4428398d6bf.png) | | 11 | !["边框 11"](https://www.xieys.club/images/posts/e4a68154170b5c82f888de2c9b7dbe9f.png) | 8 | !["边框 8"](https://www.xieys.club/images/posts/a1187b1bb730e7a98e3aa4428398d6bf.png) | | 9 | !["边框 9"](https://www.xieys.club/images/posts/e0afe8208667e6d706d631f35dce90f9.png) | 2 | !["边框 2"](https://www.xieys.club/images/posts/18bcb24845b5ae15d02fa913d90311f0.png) | | 9 | !["边框 9"](https://www.xieys.club/images/posts/e0afe8208667e6d706d631f35dce90f9.png) | 2 | !["边框 2"](https://www.xieys.club/images/posts/18bcb24845b5ae15d02fa913d90311f0.png) | | 9 | !["边框 9"](https://www.xieys.club/images/posts/e0afe8208667e6d706d631f35dce90f9.png) | 2 | !["边框 2"](https://www.xieys.club/images/posts/18bcb24845b5ae15d02fa913d90311f0.png) | | 9 | !["边框 9"](https://www.xieys.club/images/posts/e0afe8208667e6d706d631f35dce90f9.png) | 2 | !["边框 2"](https://www.xieys.club/images/posts/18bcb24845b5ae15d02fa913d90311f0.png) | | 3 | !["边框 3"](https://www.xieys.club/images/posts/ed64ed5c94b641b6c4ccd8ba696c36ce.png) | 5 | !["边框 5"](https://www.xieys.club/images/posts/ef091355b2941e02c9195f8d89383c8d.png) | | 3 | !["边框 3"](https://www.xieys.club/images/posts/ed64ed5c94b641b6c4ccd8ba696c36ce.png) | 5 | !["边框 5"](https://www.xieys.club/images/posts/ef091355b2941e02c9195f8d89383c8d.png) | | 3 | !["边框 3"](https://www.xieys.club/images/posts/ed64ed5c94b641b6c4ccd8ba696c36ce.png) | 5 | !["边框 5"](https://www.xieys.club/images/posts/ef091355b2941e02c9195f8d89383c8d.png) | | 3 | !["边框 3"](https://www.xieys.club/images/posts/ed64ed5c94b641b6c4ccd8ba696c36ce.png) | 5 | !["边框 5"](https://www.xieys.club/images/posts/ef091355b2941e02c9195f8d89383c8d.png) | | 1 | !["边框 1"](https://www.xieys.club/images/posts/3c979d487ca1ca60a5ec1c6d0837f322.png) | 6 | !["边框 6"](https://www.xieys.club/images/posts/f77fcdb8d0333143ba7cd637b573b816.png) | | 1 | !["边框 1"](https://www.xieys.club/images/posts/3c979d487ca1ca60a5ec1c6d0837f322.png) | 6 | !["边框 6"](https://www.xieys.club/images/posts/f77fcdb8d0333143ba7cd637b573b816.png) | | 1 | !["边框 1"](https://www.xieys.club/images/posts/3c979d487ca1ca60a5ec1c6d0837f322.png) | 6 | !["边框 6"](https://www.xieys.club/images/posts/f77fcdb8d0333143ba7cd637b573b816.png) | | 1 | !["边框 1"](https://www.xieys.club/images/posts/3c979d487ca1ca60a5ec1c6d0837f322.png) | 6 | !["边框 6"](https://www.xieys.club/images/posts/f77fcdb8d0333143ba7cd637b573b816.png) | ### 颜色填充 下面的表格是 Excelize 中单元格颜色填充样式和索引 `shading` 参数的关系对照: | 索引 | 样式 | 索引 | 样式 | | :--- | :--------- | :--- | :----------- | | 0 | 横向 | 3 | 对角线向下 | | 1 | 纵向 | 4 | 从对角线向内 | | 2 | 对角线向上 | 5 | 从中心向外 | ### 图案填充 下面的表格是 Excelize 中单元格图案填充样式和索引 `pattern` 参数的关系对照: | 索引 | 样式 | 索引 | 样式 | | :--- | :----------------------------------------------------------- | :--- | :----------------------------------------------------------- | | 0 | 无 | 10 | !["图案填充 10"](https://www.xieys.club/images/posts/285b4aef1ed509d791bef41dbdd5f70e.png) | | 0 | 无 | 10 | !["图案填充 10"](https://www.xieys.club/images/posts/285b4aef1ed509d791bef41dbdd5f70e.png) | | 1 | !["图案填充 1"](https://www.xieys.club/images/posts/3f4b9d66b54c7e671fbd49cbb31ee649.png) | 11 | !["图案填充 11"](https://www.xieys.club/images/posts/4722b1737b0fca6d40af8a0e1dc2b3f7.png) | | 1 | !["图案填充 1"](https://www.xieys.club/images/posts/3f4b9d66b54c7e671fbd49cbb31ee649.png) | 11 | !["图案填充 11"](https://www.xieys.club/images/posts/4722b1737b0fca6d40af8a0e1dc2b3f7.png) | | 1 | !["图案填充 1"](https://www.xieys.club/images/posts/3f4b9d66b54c7e671fbd49cbb31ee649.png) | 11 | !["图案填充 11"](https://www.xieys.club/images/posts/4722b1737b0fca6d40af8a0e1dc2b3f7.png) | | 1 | !["图案填充 1"](https://www.xieys.club/images/posts/3f4b9d66b54c7e671fbd49cbb31ee649.png) | 11 | !["图案填充 11"](https://www.xieys.club/images/posts/4722b1737b0fca6d40af8a0e1dc2b3f7.png) | | 2 | !["图案填充 2"](https://www.xieys.club/images/posts/ff6eec7eed1a6b4b1d16a4d74dac3d4a.png) | 12 | !["图案填充 12"](https://www.xieys.club/images/posts/09ee25f931c84e36bd9e81d15d034879.png) | | 2 | !["图案填充 2"](https://www.xieys.club/images/posts/ff6eec7eed1a6b4b1d16a4d74dac3d4a.png) | 12 | !["图案填充 12"](https://www.xieys.club/images/posts/09ee25f931c84e36bd9e81d15d034879.png) | | 2 | !["图案填充 2"](https://www.xieys.club/images/posts/ff6eec7eed1a6b4b1d16a4d74dac3d4a.png) | 12 | !["图案填充 12"](https://www.xieys.club/images/posts/09ee25f931c84e36bd9e81d15d034879.png) | | 2 | !["图案填充 2"](https://www.xieys.club/images/posts/ff6eec7eed1a6b4b1d16a4d74dac3d4a.png) | 12 | !["图案填充 12"](https://www.xieys.club/images/posts/09ee25f931c84e36bd9e81d15d034879.png) | | 3 | !["图案填充 3"](https://www.xieys.club/images/posts/4cb1bb7fa6969a1d1d3ddb65a8d7a2ad.png) | 13 | !["图案填充 13"](https://www.xieys.club/images/posts/8f2a33cfccc4f9061623622cbb5e9b68.png) | | 3 | !["图案填充 3"](https://www.xieys.club/images/posts/4cb1bb7fa6969a1d1d3ddb65a8d7a2ad.png) | 13 | !["图案填充 13"](https://www.xieys.club/images/posts/8f2a33cfccc4f9061623622cbb5e9b68.png) | | 3 | !["图案填充 3"](https://www.xieys.club/images/posts/4cb1bb7fa6969a1d1d3ddb65a8d7a2ad.png) | 13 | !["图案填充 13"](https://www.xieys.club/images/posts/8f2a33cfccc4f9061623622cbb5e9b68.png) | | 3 | !["图案填充 3"](https://www.xieys.club/images/posts/4cb1bb7fa6969a1d1d3ddb65a8d7a2ad.png) | 13 | !["图案填充 13"](https://www.xieys.club/images/posts/8f2a33cfccc4f9061623622cbb5e9b68.png) | | 4 | !["图案填充 4"](https://www.xieys.club/images/posts/c886d4cb3eb3bcacae2d950a2a7e8dc3.png) | 14 | !["图案填充 14"](https://www.xieys.club/images/posts/3e4bfa5fbcb917a9741d4f37a8dbbf0a.png) | | 4 | !["图案填充 4"](https://www.xieys.club/images/posts/c886d4cb3eb3bcacae2d950a2a7e8dc3.png) | 14 | !["图案填充 14"](https://www.xieys.club/images/posts/3e4bfa5fbcb917a9741d4f37a8dbbf0a.png) | | 4 | !["图案填充 4"](https://www.xieys.club/images/posts/c886d4cb3eb3bcacae2d950a2a7e8dc3.png) | 14 | !["图案填充 14"](https://www.xieys.club/images/posts/3e4bfa5fbcb917a9741d4f37a8dbbf0a.png) | | 4 | !["图案填充 4"](https://www.xieys.club/images/posts/c886d4cb3eb3bcacae2d950a2a7e8dc3.png) | 14 | !["图案填充 14"](https://www.xieys.club/images/posts/3e4bfa5fbcb917a9741d4f37a8dbbf0a.png) | | 5 | !["图案填充 5"](https://www.xieys.club/images/posts/9bc8fcac47040a85e25c352958b9beb1.png) | 15 | !["图案填充 15"](https://www.xieys.club/images/posts/6d4a2276ae66236750116d5e69747b63.png) | | 5 | !["图案填充 5"](https://www.xieys.club/images/posts/9bc8fcac47040a85e25c352958b9beb1.png) | 15 | !["图案填充 15"](https://www.xieys.club/images/posts/6d4a2276ae66236750116d5e69747b63.png) | | 5 | !["图案填充 5"](https://www.xieys.club/images/posts/9bc8fcac47040a85e25c352958b9beb1.png) | 15 | !["图案填充 15"](https://www.xieys.club/images/posts/6d4a2276ae66236750116d5e69747b63.png) | | 5 | !["图案填充 5"](https://www.xieys.club/images/posts/9bc8fcac47040a85e25c352958b9beb1.png) | 15 | !["图案填充 15"](https://www.xieys.club/images/posts/6d4a2276ae66236750116d5e69747b63.png) | | 6 | !["图案填充 6"](https://www.xieys.club/images/posts/781ed445349ef4be7d385b3aa40c43f3.png) | 16 | !["图案填充 16"](https://www.xieys.club/images/posts/d1c08a3b299ef17aa83b84f7dc9d4b4a.png) | | 6 | !["图案填充 6"](https://www.xieys.club/images/posts/781ed445349ef4be7d385b3aa40c43f3.png) | 16 | !["图案填充 16"](https://www.xieys.club/images/posts/d1c08a3b299ef17aa83b84f7dc9d4b4a.png) | | 6 | !["图案填充 6"](https://www.xieys.club/images/posts/781ed445349ef4be7d385b3aa40c43f3.png) | 16 | !["图案填充 16"](https://www.xieys.club/images/posts/d1c08a3b299ef17aa83b84f7dc9d4b4a.png) | | 6 | !["图案填充 6"](https://www.xieys.club/images/posts/781ed445349ef4be7d385b3aa40c43f3.png) | 16 | !["图案填充 16"](https://www.xieys.club/images/posts/d1c08a3b299ef17aa83b84f7dc9d4b4a.png) | | 7 | !["图案填充 7"](https://www.xieys.club/images/posts/24a0ee5aa3b2b09ebfc66ac2f60449d1.png) | 17 | !["图案填充 17"](https://www.xieys.club/images/posts/8e33f7a62bce3fe4e988e549377d2b29.png) | | 7 | !["图案填充 7"](https://www.xieys.club/images/posts/24a0ee5aa3b2b09ebfc66ac2f60449d1.png) | 17 | !["图案填充 17"](https://www.xieys.club/images/posts/8e33f7a62bce3fe4e988e549377d2b29.png) | | 7 | !["图案填充 7"](https://www.xieys.club/images/posts/24a0ee5aa3b2b09ebfc66ac2f60449d1.png) | 17 | !["图案填充 17"](https://www.xieys.club/images/posts/8e33f7a62bce3fe4e988e549377d2b29.png) | | 7 | !["图案填充 7"](https://www.xieys.club/images/posts/24a0ee5aa3b2b09ebfc66ac2f60449d1.png) | 17 | !["图案填充 17"](https://www.xieys.club/images/posts/8e33f7a62bce3fe4e988e549377d2b29.png) | | 8 | !["图案填充 8"](https://www.xieys.club/images/posts/a792b5967573c056a53fbaeb51ac4e62.png) | 18 | !["图案填充 18"](https://www.xieys.club/images/posts/73de9bfdf2693c57c27d6b32336cfb15.png) | | 8 | !["图案填充 8"](https://www.xieys.club/images/posts/a792b5967573c056a53fbaeb51ac4e62.png) | 18 | !["图案填充 18"](https://www.xieys.club/images/posts/73de9bfdf2693c57c27d6b32336cfb15.png) | | 8 | !["图案填充 8"](https://www.xieys.club/images/posts/a792b5967573c056a53fbaeb51ac4e62.png) | 18 | !["图案填充 18"](https://www.xieys.club/images/posts/73de9bfdf2693c57c27d6b32336cfb15.png) | | 8 | !["图案填充 8"](https://www.xieys.club/images/posts/a792b5967573c056a53fbaeb51ac4e62.png) | 18 | !["图案填充 18"](https://www.xieys.club/images/posts/73de9bfdf2693c57c27d6b32336cfb15.png) | | 9 | !["图案填充 9](https://www.xieys.club/images/posts/f3745ad4b59698a16ced47cfd06ffb2f.png) | | | | 9 | !["图案填充 9](https://www.xieys.club/images/posts/f3745ad4b59698a16ced47cfd06ffb2f.png) | | | ### 水平对齐方式 下面的表格是 Excelize 中单元格水平对齐方式 `horizontal` 参数与样式关系对照表: | 参数 | 样式 | | :--------------- | :--------------- | | left | 向左(缩进) | | center | 居中 | | right | 靠右(缩进) | | fill | 填充 | | justify | 两端对齐 | | centerContinuous | 跨列居中 | | distributed | 分散对齐(缩进) | ### 垂直对齐方式 下面的表格是 Excelize 中单元格垂直对齐方式 `vertical` 参数与样式关系对照表: | 参数 | 样式 | | :---------- | :------- | | top | 顶端对齐 | | center | 居中 | | justify | 两端对齐 | | distributed | 分散对齐 | ### 字体下划线 下面的表格是 Excelize 中单元格字体下划线 `underline` 参数与样式关系对照表: | 参数 | 样式 | | :----- | :--- | | single | 单线 | | double | 双线 | ### 数字自定义格式 下面的表格是 Excelize 中支持的索引 `number_format` 参数与数字自定义格式类型对照表: | 索引 | 类型 | | :--- | :----------------------------------------------------- | | 0 | `General` | | 1 | `0` | | 2 | `0.00` | | 3 | `#,##0` | | 4 | `#,##0.00` | | 5 | `($#,##0*);($#,##0)*` | | 6 | `($#,##0);Red` | | 7 | `($#,##0.00*);($#,##0.00)*` | | 8 | `($#,##0.00);Red` | | 9 | `0%` | | 10 | `0.00%` | | 11 | `0.00E+00` | | 12 | `# ?/?` | | 13 | `# ??/??` | | 14 | `m/d/yy` | | 15 | `d-mmm-yy` | | 16 | `d-mmm` | | 17 | `mmm-yy` | | 18 | `h:mm AM/PM` | | 19 | `h:mm:ss AM/PM` | | 20 | `h:mm` | | 21 | `h:mm:ss` | | 22 | `m/d/yy h:mm` | | … | `…` | | 37 | `(#,##0*);(#,##0)*` | | 38 | `(#,##0);Red` | | 39 | `(#,##0.00*);(#,##0.00)*` | | 40 | `(#,##0.00);Red` | | 41 | `*(\* #,##0*);*(\* (#,##0);*( *"-"\*);\*(@\*)**` | | 42 | `($ #,##0*);*($ *(#,##0);_($* "-"*);*(@*)*` | | 43 | `( *#,##0.00\*);\*(* (#,##0.00);*(\* "-"??*);*(@*)` | | 44 | `*($\* #,##0.00*);*($\* (#,##0.00);*($* "-"??*);*(@_)` | | 45 | `mm:ss` | | 46 | `[h]:mm:ss` | | 47 | `mm:ss.0` | | 48 | `##0.0E+0` | | 49 | `@` | #### 繁体中文数字自定义格式 下面的表格是 Excelize 中支持的索引 `number_format` 参数与繁体中文 `zh-tw` 版本数字自定义格式类型对照表: | 索引 | 类型 | | :--- | :----------------------------- | | 27 | `[$-404]e/m/d` | | 28 | `[$-404]e"年"m"月"d"日"` | | 29 | `[$-404]e"年"m"月"d"日"` | | 30 | `m/d/yy` | | 31 | `yyyy"年"m"月"d"日"` | | 32 | `hh"時"mm"分"` | | 33 | `hh"時"mm"分"ss"秒"` | | 34 | `上午/下午 hh"時"mm"分"` | | 35 | `上午/下午 hh"時"mm"分"ss"秒"` | | 36 | `[$-404]e/m/d` | | 50 | `[$-404]e/m/d` | | 51 | `[$-404]e"年"m"月"d"日"` | | 52 | `上午/下午 hh"時"mm"分"` | | 53 | `上午/下午 hh"時"mm"分"ss"秒"` | | 54 | `[$-404]e"年"m"月"d"日"` | | 55 | `上午/下午 hh"時"mm"分"` | | 56 | `上午/下午 hh"時"mm"分"ss"秒"` | | 57 | `[$-404]e/m/d` | | 58 | `[$-404]e"年"m"月"d"日"` | #### 简体中文数字自定义格式 下面的表格是 Excelize 中支持的索引 `number_format` 参数与简体中文 `zh-cn` 版本数字自定义格式类型对照表: | 索引 | 类型 | | :--- | :--------------------------- | | 27 | `yyyy"年"m"月"` | | 28 | `m"月"d"日"` | | 29 | `m"月"d"日"` | | 30 | `m-d-yy` | | 31 | `yyyy"年"m"月"d"日"` | | 32 | `h"时"mm"分"` | | 33 | `h"时"mm"分"ss"秒"` | | 34 | `上午/下午 h"时"mm"分"` | | 35 | `上午/下午 h"时"mm"分"ss"秒` | | 36 | `yyyy"年"m"月` | | 50 | `yyyy"年"m"月` | | 51 | `m"月"d"日` | | 52 | `yyyy"年"m"月` | | 53 | `m"月"d"日` | | 54 | `m"月"d"日` | | 55 | `上午/下午 h"时"mm"分` | | 56 | `上午/下午 h"时"mm"分"ss"秒` | | 57 | `yyyy"年"m"月` | | 58 | `m"月"d"日"` | #### Unicode 繁体中文字型数字自定义格式 下面的表格是 Excelize 中支持的索引 `number_format` 参数与 Unicode 繁体中文字型 `zh-tw` 版本数字自定义格式类型对照表: | 索引 | 类型 | | :--- | :----------------------------------------- | | 27 | `[$-404]e/m/` | | 28 | `[$-404]e"5E74"m"6708"d"65E5` | | 29 | `[$-404]e"5E74"m"6708"d"65E5` | | 30 | `m/d/y` | | 31 | `yyyy"5E74"m"6708"d"65E5` | | 32 | `hh"6642"mm"5206` | | 33 | `hh"6642"mm"5206"ss"79D2` | | 34 | `4E0A5348/4E0B5348hh"6642"mm"5206` | | 35 | `4E0A5348/4E0B5348hh"6642"mm"5206"ss"79D2` | | 36 | `[$-404]e/m/` | | 50 | `[$-404]e/m/` | | 51 | `[$-404]e"5E74"m"6708"d"65E5` | | 52 | `4E0A5348/4E0B5348hh"6642"mm"5206` | | 53 | `4E0A5348/4E0B5348hh"6642"mm"5206"ss"79D2` | | 54 | `[$-404]e"5E74"m"6708"d"65E5` | | 55 | `4E0A5348/4E0B5348hh"6642"mm"5206` | | 56 | `4E0A5348/4E0B5348hh"6642"mm"5206"ss"79D2` | | 57 | `[$-404]e/m/` | | 58 | `[$-404]e"5E74"m"6708"d"65E5"` | #### Unicode 简体中文字型数字自定义格式 下面的表格是 Excelize 中支持的索引 `number_format` 参数与 Unicode 简体中文字型 `zh-cn` 版本数字自定义格式类型对照表: | 索引 | 类型 | | :--- | :---------------------------------------- | | 27 | `yyyy"5E74"m"6708` | | 28 | `m"6708"d"65E5` | | 29 | `m"6708"d"65E5` | | 30 | `m-d-y` | | 31 | `yyyy"5E74"m"6708"d"65E5` | | 32 | `h"65F6"mm"5206` | | 33 | `h"65F6"mm"5206"ss"79D2` | | 34 | `4E0A5348/4E0B5348h"65F6"mm"5206` | | 35 | `4E0A5348/4E0B5348h"65F6"mm"5206"ss"79D2` | | 36 | `yyyy"5E74"m"6708` | | 50 | `yyyy"5E74"m"6708` | | 51 | `m"6708"d"65E5` | | 52 | `yyyy"5E74"m"6708` | | 53 | `m"6708"d"65E5` | | 54 | `m"6708"d"65E5` | | 55 | `4E0A5348/4E0B5348h"65F6"mm"5206` | | 56 | `4E0A5348/4E0B5348h"65F6"mm"5206"ss"79D2` | | 57 | `yyyy"5E74"m"6708` | | 58 | `m"6708"d"65E5"` | #### 日本语数字自定义格式 下面的表格是 Excelize 中支持的索引 `number_format` 参数与日本语 `ja-jp` 版本数字自定义格式类型对照表: | 索引 | 类型 | | :--- | :-------------------------- | | 27 | `[$-411]ge.m.d` | | 28 | `[$-411]ggge"年"m"月"d"日` | | 29 | `[$-411]ggge"年"m"月"d"日` | | 30 | `m/d/y` | | 31 | `yyyy"年"m"月"d"日` | | 32 | `h"時"mm"分` | | 33 | `h"時"mm"分"ss"秒` | | 34 | `yyyy"年"m"月` | | 35 | `m"月"d"日` | | 36 | `[$-411]ge.m.d` | | 50 | `[$-411]ge.m.d` | | 51 | `[$-411]ggge"年"m"月"d"日` | | 52 | `yyyy"年"m"月` | | 53 | `m"月"d"日` | | 54 | `[$-411]ggge"年"m"月"d"日` | | 55 | `yyyy"年"m"月` | | 56 | `m"月"d"日` | | 57 | `[$-411]ge.m.d` | | 58 | `[$-411]ggge"年"m"月"d"日"` | #### 韩语数字自定义格式 下面的表格是 Excelize 中支持的索引 `number_format` 参数与韩语 `ko-kr` 版本数字自定义格式类型对照表: | 索引 | 类型 | | :--- | :---------------------- | | 27 | `yyyy"年" mm"月" dd"日` | | 28 | `mm-d` | | 29 | `mm-d` | | 30 | `mm-dd-y` | | 31 | `yyyy"년" mm"월" dd"일` | | 32 | `h"시" mm"분` | | 33 | `h"시" mm"분" ss"초` | | 34 | `yyyy-mm-d` | | 35 | `yyyy-mm-d` | | 36 | `yyyy"年" mm"月" dd"日` | | 50 | `yyyy"年" mm"月" dd"日` | | 51 | `mm-d` | | 52 | `yyyy-mm-d` | | 53 | `yyyy-mm-d` | | 54 | `mm-d` | | 55 | `yyyy-mm-d` | | 56 | `yyyy-mm-d` | | 57 | `yyyy"年" mm"月" dd"日` | | 58 | `mm-dd` | #### Unicode 日本语字型数字自定义格式 下面的表格是 Excelize 中支持的索引 `number_format` 参数与 Unicode 日本语字型 `ja-jp` 版本数字自定义格式类型对照表: | 索引 | 类型 | | :--- | :-------------------------------- | | 27 | `[$-411]ge.m.d` | | 28 | `[$-411]ggge"5E74"m"6708"d"65E5` | | 29 | `[$-411]ggge"5E74"m"6708"d"65E5` | | 30 | `m/d/y` | | 31 | `yyyy"5E74"m"6708"d"65E5` | | 32 | `h"6642"mm"5206` | | 33 | `h"6642"mm"5206"ss"79D2` | | 34 | `yyyy"5E74"m"6708` | | 35 | `m"6708"d"65E5` | | 36 | `[$-411]ge.m.d` | | 50 | `[$-411]ge.m.d` | | 51 | `[$-411]ggge"5E74"m"6708"d"65E5` | | 52 | `yyyy"5E74"m"6708` | | 53 | `m"6708"d"65E5` | | 54 | `[$-411]ggge"5E74"m"6708"d"65E5` | | 55 | `yyyy"5E74"m"6708` | | 56 | `m"6708"d"65E5` | | 57 | `[$-411]ge.m.d` | | 58 | `[$-411]ggge"5E74"m"6708"d"65E5"` | #### Unicode 韩语字型数字自定义格式 下面的表格是 Excelize 中支持的索引 `number_format` 参数与 Unicode 韩语字型 `ko-kr` 版本数字自定义格式类型对照表: | 索引 | 类型 | | :--- | :---------------------------- | | 27 | `yyyy"5E74" mm"6708" dd"65E5` | | 28 | `mm-d` | | 29 | `mm-d` | | 30 | `mm-dd-y` | | 31 | `yyyy"B144" mm"C6D4" dd"C77C` | | 32 | `h"C2DC" mm"BD84` | | 33 | `h"C2DC" mm"BD84" ss"CD08` | | 34 | `yyyy-mm-d` | | 35 | `yyyy-mm-d` | | 36 | `yyyy"5E74" mm"6708" dd"65E5` | | 50 | `yyyy"5E74" mm"6708" dd"65E5` | | 51 | `mm-d` | | 52 | `yyyy-mm-d` | | 53 | `yyyy-mm-d` | | 54 | `mm-d` | | 55 | `yyyy-mm-d` | | 56 | `yyyy-mm-d` | | 57 | `yyyy"5E74" mm"6708" dd"65E5` | | 58 | `mm-dd` | #### 泰国语数字自定义格式 下面的表格是 Excelize 中支持的索引 `number_format` 参数与泰国语 `th-th` 版本数字自定义格式类型对照表: | 索引 | 类型 | | :--- | :------------- | | 59 | `t` | | 60 | `t0.0` | | 61 | `t#,##` | | 62 | `t#,##0.0` | | 67 | `t0` | | 68 | `t0.00` | | 69 | `t# ?/` | | 70 | `t# ??/?` | | 71 | `ว/ด/ปปป` | | 72 | `ว-ดดด-ป` | | 73 | `ว-ดด` | | 74 | `ดดด-ป` | | 75 | `ช:น` | | 76 | `ช:นน:ท` | | 77 | `ว/ด/ปปปป ช:น` | | 78 | `นน:ท` | | 79 | `[ช]:นน:ท` | | 80 | `นน:ทท.` | | 81 | `d/m/bb` | #### Unicode 泰国语型数字自定义格式 下面的表格是 Excelize 中支持的索引 `number_format` 参数与 Unicode 泰国语字型 `th-th` 版本数字自定义格式类型对照表: | 索引 | 类型 | | :--- | :---------------------------------------- | | 59 | `t` | | 60 | `t0.0` | | 61 | `t#,##` | | 62 | `t#,##0.0` | | 67 | `t0` | | 68 | `t0.00` | | 69 | `t# ?/` | | 70 | `t# ??/?` | | 71 | `0E27/0E14/0E1B0E1B0E1B0E1` | | 72 | `0E27-0E140E140E14-0E1B0E1` | | 73 | `0E27-0E140E140E1` | | 74 | `0E140E140E14-0E1B0E1` | | 75 | `0E0A:0E190E1` | | 76 | `0E0A:0E190E19:0E170E1` | | 77 | `0E27/0E14/0E1B0E1B0E1B0E1B 0E0A:0E190E1` | | 78 | `0E190E19:0E170E1` | | 79 | `[0E0A]:0E190E19:0E170E1` | | 80 | `0E190E19:0E170E17.` | | 81 | `d/m/bb` | ### 货币格式 Excelize 目前支持的货币格式索引如下表所示,索引号仅用于标记,不在 Office Excel 文件中使用,目前无法通过函数 [`GetCellValue`](https://xuri.me/excelize/zh-hans/cell.html#GetCellValue) 获取格式化值后的值。 | 索引 | 货币格式 | | :--- | :----------------------------------------------------------- | | 164 | `CN¥` | | 165 | `$ English (China)` | | 166 | `$ Cherokee (United States)` | | 167 | `$ Chinese (Singapore)` | | 168 | `$ Chinese (Taiwan)` | | 169 | `$ English (Australia)` | | 170 | `$ English (Belize)` | | 171 | `$ English (Canada)` | | 172 | `$ English (Jamaica)` | | 173 | `$ English (New Zealand)` | | 174 | `$ English (Singapore)` | | 175 | `$ English (Trinidad & Tobago)` | | 176 | `$ English (U.S. Vigin Islands)` | | 177 | `$ English (United States)` | | 178 | `$ French (Canada)` | | 179 | `$ Hawaiian (United States)` | | 180 | `$ Malay (Brunei)` | | 181 | `$ Quechua (Ecuador)` | | 182 | `$ Spanish (Chile)` | | 183 | `$ Spanish (Colombia)` | | 184 | `$ Spanish (Ecuador)` | | 185 | `$ Spanish (El Salvador)` | | 186 | `$ Spanish (Mexico)` | | 187 | `$ Spanish (Puerto Rico)` | | 188 | `$ Spanish (United States)` | | 189 | `$ Spanish (Uruguay)` | | 190 | `£ English (United Kingdom)` | | 191 | `£ Scottish Gaelic (United Kingdom)` | | 192 | `£ Welsh (United Kindom)` | | 193 | `¥ Chinese (China)` | | 194 | `¥ Japanese (Japan)` | | 195 | `¥ Sichuan Yi (China)` | | 196 | `¥ Tibetan (China)` | | 197 | `¥ Uyghur (China)` | | 198 | `֏ Armenian (Armenia)` | | 199 | `؋ Pashto (Afghanistan)` | | 200 | `؋ Persian (Afghanistan)` | | 201 | `৳ Bengali (Bangladesh)` | | 202 | `៛ Khmer (Cambodia)` | | 203 | `₡ Spanish (Costa Rica)` | | 204 | `₦ Hausa (Nigeria)` | | 205 | `₦ Igbo (Nigeria)` | | 206 | `₦ Yoruba (Nigeria)` | | 207 | `₩ Korean (South Korea)` | | 208 | `₪ Hebrew (Israel)` | | 209 | `₫ Vietnamese (Vietnam)` | | 210 | `€ Basque (Spain)` | | 211 | `€ Breton (France)` | | 212 | `€ Catalan (Spain)` | | 213 | `€ Corsican (France)` | | 214 | `€ Dutch (Belgium)` | | 215 | `€ Dutch (Netherlands)` | | 216 | `€ English (Ireland)` | | 217 | `€ Estonian (Estonia)` | | 218 | `€ Euro (€ 123)` | | 219 | `€ Euro (123 €)` | | 220 | `€ Finnish (Finland)` | | 221 | `€ French (Belgium)` | | 222 | `€ French (France)` | | 223 | `€ French (Luxembourg)` | | 224 | `€ French (Monaco)` | | 225 | `€ French (Réunion)` | | 226 | `€ Galician (Spain)` | | 227 | `€ German (Austria)` | | 228 | `€ German (Luxembourg)` | | 229 | `€ Greek (Greece)` | | 230 | `€ Inari Sami (Finland)` | | 231 | `€ Irish (Ireland)` | | 232 | `€ Italian (Italy)` | | 233 | `€ Latin (Italy)` | | 234 | `€ Latin, Serbian (Montenegro)` | | 235 | `€ Larvian (Latvia)` | | 236 | `€ Lithuanian (Lithuania)` | | 237 | `€ Lower Sorbian (Germany)` | | 238 | `€ Luxembourgish (Luxembourg)` | | 239 | `€ Maltese (Malta)` | | 240 | `€ Northern Sami (Finland)` | | 241 | `€ Occitan (France)` | | 242 | `€ Portuguese (Portugal)` | | 243 | `€ Serbian (Montenegro)` | | 244 | `€ Skolt Sami (Finland)` | | 245 | `€ Slovak (Slovakia)` | | 246 | `€ Slovenian (Slovenia)` | | 247 | `€ Spanish (Spain)` | | 248 | `€ Swedish (Finland)` | | 249 | `€ Swiss German (France)` | | 250 | `€ Upper Sorbian (Germany)` | | 251 | `€ Western Frisian (Netherlands)` | | 252 | `₭ Lao (Laos)` | | 253 | `₮ Mongolian (Mongolia)` | | 254 | `₮ Mongolian, Mongolian (Mongolia)` | | 255 | `₱ English (Philippines)` | | 256 | `₱ Filipino (Philippines)` | | 257 | `₴ Ukrainian (Ukraine)` | | 258 | `₸ Kazakh (Kazakhstan)` | | 259 | `₹ Arabic, Kashmiri (India)` | | 260 | `₹ English (India)` | | 261 | `₹ Gujarati (India)` | | 262 | `₹ Hindi (India)` | | 263 | `₹ Kannada (India)` | | 264 | `₹ Kashmiri (India)` | | 265 | `₹ Konkani (India)` | | 266 | `₹ Manipuri (India)` | | 267 | `₹ Marathi (India)` | | 268 | `₹ Nepali (India)` | | 269 | `₹ Oriya (India)` | | 270 | `₹ Punjabi (India)` | | 271 | `₹ Sanskrit (India)` | | 272 | `₹ Sindhi (India)` | | 273 | `₹ Tamil (India)` | | 274 | `₹ Urdu (India)` | | 275 | `₺ Turkish (Turkey)` | | 276 | `₼ Azerbaijani (Azerbaijan)` | | 277 | `₼ Cyrillic, Azerbaijani (Azerbaijan)` | | 278 | `₽ Russian (Russia)` | | 279 | `₽ Sakha (Russia)` | | 280 | `₾ Georgian (Georgia)` | | 281 | `B/. Spanish (Panama)` | | 282 | `Br Oromo (Ethiopia)` | | 283 | `Br Somali (Ethiopia)` | | 284 | `Br Tigrinya (Ethiopia)` | | 285 | `Bs Quechua (Bolivia)` | | 286 | `Bs Spanish (Bolivia)` | | 287 | `BS. Spanish (Venezuela)` | | 288 | `BWP Tswana (Botswana)` | | 289 | `C$ Spanish (Nicaragua)` | | 290 | `CA$ Latin, Inuktitut (Canada)` | | 291 | `CA$ Mohawk (Canada)` | | 292 | `CA$ Unified Canadian Aboriginal Syllabics, Inuktitut (Canada)` | | 293 | `CFA French (Mali)` | | 294 | `CFA French (Senegal)` | | 295 | `CFA Fulah (Senegal)` | | 296 | `CFA Wolof (Senegal)` | | 297 | `CHF French (Switzerland)` | | 298 | `CHF German (Liechtenstein)` | | 299 | `CHF German (Switzerland)` | | 300 | `CHF Italian (Switzerland)` | | 301 | `CHF Romansh (Switzerland)` | | 302 | `CLP Mapuche (Chile)` | | 303 | `CN¥ Mongolian, Mongolian (China)` | | 304 | `DZD Central Atlas Tamazight (Algeria)` | | 305 | `FCFA French (Cameroon)` | | 306 | `Ft Hungarian (Hungary)` | | 307 | `G French (Haiti)` | | 308 | `Gs. Spanish (Paraguay)` | | 309 | `GTQ K'iche' (Guatemala)` | | 310 | `HK$ Chinese (Hong Kong (China))` | | 311 | `HK$ English (Hong Kong (China))` | | 312 | `HRK Croatian (Croatia)` | | 313 | `IDR English (Indonesia)` | | 314 | `IQD Arbic, Central Kurdish (Iraq)` | | 315 | `ISK Icelandic (Iceland)` | | 316 | `K Burmese (Myanmar (Burma))` | | 317 | `Kč Czech (Czech Republic)` | | 318 | `KM Bosnian (Bosnia & Herzegovina)` | | 319 | `KM Croatian (Bosnia & Herzegovina)` | | 320 | `KM Latin, Serbian (Bosnia & Herzegovina)` | | 321 | `kr Faroese (Faroe Islands)` | | 322 | `kr Northern Sami (Norway)` | | 323 | `kr Northern Sami (Sweden)` | | 324 | `kr Norwegian Bokmål (Norway)` | | 325 | `kr Norwegian Nynorsk (Norway)` | | 326 | `kr Swedish (Sweden)` | | 327 | `kr. Danish (Denmark)` | | 328 | `kr. Kalaallisut (Greenland)` | | 329 | `Ksh Swahili (kenya)` | | 330 | `L Romanian (Moldova)` | | 331 | `L Russian (Moldova)` | | 332 | `L Spanish (Honduras)` | | 333 | `Lekë Albanian (Albania)` | | 334 | `MAD Arabic, Central Atlas Tamazight (Morocco)` | | 335 | `MAD French (Morocco)` | | 336 | `MAD Tifinagh, Central Atlas Tamazight (Morocco)` | | 337 | `MOP$ Chinese (Macau (China))` | | 338 | `MVR Divehi (Maldives)` | | 339 | `Nfk Tigrinya (Eritrea)` | | 340 | `NGN Bini (Nigeria)` | | 341 | `NGN Fulah (Nigeria)` | | 342 | `NGN Ibibio (Nigeria)` | | 343 | `NGN Kanuri (Nigeria)` | | 344 | `NOK Lule Sami (Norway)` | | 345 | `NOK Southern Sami (Norway)` | | 346 | `NZ$ Maori (New Zealand)` | | 347 | `PKR Sindhi (Pakistan)` | | 348 | `PYG Guarani (Paraguay)` | | 349 | `Q Spanish (Guatemala)` | | 350 | `R Afrikaans (South Africa)` | | 351 | `R English (South Africa)` | | 352 | `R Zulu (South Africa)` | | 353 | `R$ Portuguese (Brazil)` | | 354 | `RD$ Spanish (Dominican Republic)` | | 355 | `RF Kinyarwanda (Rwanda)` | | 356 | `RM English (Malaysia)` | | 357 | `RM Malay (Malaysia)` | | 358 | `RON Romanian (Romania)` | | 359 | `Rp Indonesoan (Indonesia)` | | 360 | `Rs Urdu (Pakistan)` | | 361 | `Rs. Tamil (Sri Lanka)` | | 362 | `RSD Latin, Serbian (Serbia)` | | 363 | `RSD Serbian (Serbia)` | | 364 | `RUB Bashkir (Russia)` | | 365 | `RUB Tatar (Russia)` | | 366 | `S/. Quechua (Peru)` | | 367 | `S/. Spanish (Peru)` | | 368 | `SEK Lule Sami (Sweden)` | | 369 | `SEK Southern Sami (Sweden)` | | 370 | `soʻm Latin, Uzbek (Uzbekistan)` | | 371 | `soʻm Uzbek (Uzbekistan)` | | 372 | `SYP Syriac (Syria)` | | 373 | `THB Thai (Thailand)` | | 374 | `TMT Turkmen (Turkmenistan)` | | 375 | `US$ English (Zimbabwe)` | | 376 | `ZAR Northern Sotho (South Africa)` | | 377 | `ZAR Southern Sotho (South Africa)` | | 378 | `ZAR Tsonga (South Africa)` | | 379 | `ZAR Tswana (south Africa)` | | 380 | `ZAR Venda (South Africa)` | | 381 | `ZAR Xhosa (South Africa)` | | 382 | `zł Polish (Poland)` | | 383 | `ден Macedonian (Macedonia)` | | 384 | `KM Cyrillic, Bosnian (Bosnia & Herzegovina)` | | 385 | `KM Serbian (Bosnia & Herzegovina)` | | 386 | `лв. Bulgarian (Bulgaria)` | | 387 | `p. Belarusian (Belarus)` | | 388 | `сом Kyrgyz (Kyrgyzstan)` | | 389 | `сом Tajik (Tajikistan)` | | 390 | `ج.م. Arabic (Egypt)` | | 391 | `د.أ. Arabic (Jordan)` | | 392 | `د.أ. Arabic (United Arab Emirates)` | | 393 | `د.ب. Arabic (Bahrain)` | | 394 | `د.ت. Arabic (Tunisia)` | | 395 | `د.ج. Arabic (Algeria)` | | 396 | `د.ع. Arabic (Iraq)` | | 397 | `د.ك. Arabic (Kuwait)` | | 398 | `د.ل. Arabic (Libya)` | | 399 | `د.م. Arabic (Morocco)` | | 400 | `ر Punjabi (Pakistan)` | | 401 | `ر.س. Arabic (Saudi Arabia)` | | 402 | `ر.ع. Arabic (Oman)` | | 403 | `ر.ق. Arabic (Qatar)` | | 404 | `ر.ي. Arabic (Yemen)` | | 405 | `ریال Persian (Iran)` | | 406 | `ل.س. Arabic (Syria)` | | 407 | `ل.ل. Arabic (Lebanon)` | | 408 | `ብር Amharic (Ethiopia)` | | 409 | `रू Nepaol (Nepal)` | | 410 | `රු. Sinhala (Sri Lanka)` | | 411 | `ADP` | | 412 | `AED` | | 413 | `AFA` | | 414 | `AFN` | | 415 | `ALL` | | 416 | `AMD` | | 417 | `ANG` | | 418 | `AOA` | | 419 | `ARS` | | 420 | `ATS` | | 421 | `AUD` | | 422 | `AWG` | | 423 | `AZM` | | 424 | `AZN` | | 425 | `BAM` | | 426 | `BBD` | | 427 | `BDT` | | 428 | `BEF` | | 429 | `BGL` | | 430 | `BGN` | | 431 | `BHD` | | 432 | `BIF` | | 433 | `BMD` | | 434 | `BND` | | 435 | `BOB` | | 436 | `BOV` | | 437 | `BRL` | | 438 | `BSD` | | 439 | `BTN` | | 440 | `BWP` | | 441 | `BYR` | | 442 | `BZD` | | 443 | `CAD` | | 444 | `CDF` | | 445 | `CHE` | | 446 | `CHF` | | 447 | `CHW` | | 448 | `CLF` | | 449 | `CLP` | | 450 | `CNY` | | 451 | `COP` | | 452 | `COU` | | 453 | `CRC` | | 454 | `CSD` | | 455 | `CUC` | | 456 | `CVE` | | 457 | `CYP` | | 458 | `CZK` | | 459 | `DEM` | | 460 | `DJF` | | 461 | `DKK` | | 462 | `DOP` | | 463 | `DZD` | | 464 | `ECS` | | 465 | `ECV` | | 466 | `EEK` | | 467 | `EGP` | | 468 | `ERN` | | 469 | `ESP` | | 470 | `ETB` | | 471 | `EUR` | | 472 | `FIM` | | 473 | `FJD` | | 474 | `FKP` | | 475 | `FRF` | | 476 | `GBP` | | 477 | `GEL` | | 478 | `GHC` | | 479 | `GHS` | | 480 | `GIP` | | 481 | `GMD` | | 482 | `GNF` | | 483 | `GRD` | | 484 | `GTQ` | | 485 | `GYD` | | 486 | `HKD` | | 487 | `HNL` | | 488 | `HRK` | | 489 | `HTG` | | 490 | `HUF` | | 491 | `IDR` | | 492 | `IEP` | | 493 | `ILS` | | 494 | `INR` | | 495 | `IQD` | | 496 | `IRR` | | 497 | `ISK` | | 498 | `ITL` | | 499 | `JMD` | | 500 | `JOD` | | 501 | `JPY` | | 502 | `KAF` | | 503 | `KES` | | 504 | `KGS` | | 505 | `KHR` | | 506 | `KMF` | | 507 | `KPW` | | 508 | `KRW` | | 509 | `KWD` | | 510 | `KYD` | | 511 | `KZT` | | 512 | `LAK` | | 513 | `LBP` | | 514 | `LKR` | | 515 | `LRD` | | 516 | `LSL` | | 517 | `LTL` | | 518 | `LUF` | | 519 | `LVL` | | 520 | `LYD` | | 521 | `MAD` | | 522 | `MDL` | | 523 | `MGA` | | 524 | `MGF` | | 525 | `MKD` | | 526 | `MMK` | | 527 | `MNT` | | 528 | `MOP` | | 529 | `MRO` | | 530 | `MTL` | | 531 | `MUR` | | 532 | `MVR` | | 533 | `MWK` | | 534 | `MXN` | | 535 | `MXV` | | 536 | `MYR` | | 537 | `MZM` | | 538 | `MZN` | | 539 | `NAD` | | 540 | `NGN` | | 541 | `NIO` | | 542 | `NLG` | | 543 | `NOK` | | 544 | `NPR` | | 545 | `NTD` | | 546 | `NZD` | | 547 | `OMR` | | 548 | `PAB` | | 549 | `PEN` | | 550 | `PGK` | | 551 | `PHP` | | 552 | `PKR` | | 553 | `PLN` | | 554 | `PTE` | | 555 | `PYG` | | 556 | `QAR` | | 557 | `ROL` | | 558 | `RON` | | 559 | `RSD` | | 560 | `RUB` | | 561 | `RUR` | | 562 | `RWF` | | 563 | `SAR` | | 564 | `SBD` | | 565 | `SCR` | | 566 | `SDD` | | 567 | `SDG` | | 568 | `SDP` | | 569 | `SEK` | | 570 | `SGD` | | 571 | `SHP` | | 572 | `SIT` | | 573 | `SKK` | | 574 | `SLL` | | 575 | `SOS` | | 576 | `SPL` | | 577 | `SRD` | | 578 | `SRG` | | 579 | `STD` | | 580 | `SVC` | | 581 | `SYP` | | 582 | `SZL` | | 583 | `THB` | | 584 | `TJR` | | 585 | `TJS` | | 586 | `TMM` | | 587 | `TMT` | | 588 | `TND` | | 589 | `TOP` | | 590 | `TRL` | | 591 | `TRY` | | 592 | `TTD` | | 593 | `TWD` | | 594 | `TZS` | | 595 | `UAH` | | 596 | `UGX` | | 597 | `USD` | | 598 | `USN` | | 599 | `USS` | | 600 | `UYI` | | 601 | `UYU` | | 602 | `UZS` | | 603 | `VEB` | | 604 | `VEF` | | 605 | `VND` | | 606 | `VUV` | | 607 | `WST` | | 608 | `XAF` | | 609 | `XAG` | | 610 | `XAU` | | 611 | `XB5` | | 612 | `XBA` | | 613 | `XBB` | | 614 | `XBC` | | 615 | `XBD` | | 616 | `XCD` | | 617 | `XDR` | | 618 | `XFO` | | 619 | `XFU` | | 620 | `XOF` | | 621 | `XPD` | | 622 | `XPF` | | 623 | `XPT` | | 624 | `XTS` | | 625 | `XXX` | | 626 | `YER` | | 627 | `YUM` | | 628 | `ZAR` | | 629 | `ZMK` | | 630 | `ZMW` | | 631 | `ZWD` | | 632 | `ZWL` | | 633 | `ZWN` | | 634 | `ZWR` | Excelize 支持为单元格设置自定义数字格式。例如,将 `Sheet1` 工作表的 `A6` 单元格 设置为乌拉圭(西班牙)格式的日期类型: ![设置自定义数字格式](https://www.xieys.club/images/posts/34becfa87a532966691e5c98f0e0a82d.png) ![设置自定义数字格式](https://www.xieys.club/images/posts/34becfa87a532966691e5c98f0e0a82d.png) ``` f := excelize.NewFile() f.SetCellValue("Sheet1", "A6", 42920.5) style, err := f.NewStyle(`{"custom_number_format": "[$-380A]dddd\\,\\ dd\" de \"mmmm\" de \"yyyy;@"}`) err = f.SetCellStyle("Sheet1", "A6", "A6", style) ``` 单元格 `Sheet1!A6` 在 Office Excel 应用程序中将会被格式化为:`martes, 04 de Julio de 2017` ## 数据 ### 数据验证 ``` func (f *File) AddDataValidation(sheet string, dv *DataValidation) ``` 根据给定的工作表名和数据验证对象设置数据验证规则,数据验证对象可通过 `NewDataValidation` 函数创建,数据验证类型和条件参考[常量](https://www.bookstack.cn/read/excelize-v2.0/11.md)中的定义。 例1,为 `Sheet1!A1:B2` 设置包含验证条件为允许介于整数 10 到 20 的数据验证规则,输入无效数据时显示出错警告,标题为: "error title",错误信息 "error body": ![数据验证](https://static.sitestack.cn/projects/excelize-v2.0/2da34db78dac801d47cf12b945fdc42c.png) ``` dvRange := excelize.NewDataValidation(true) dvRange.Sqref = "A1:B2" dvRange.SetRange(10, 20, excelize.DataValidationTypeWhole, excelize.DataValidationOperatorBetween) dvRange.SetError(excelize.DataValidationErrorStyleStop, "error title", "error body") f.AddDataValidation("Sheet1", dvRange) ``` 例2,为 `Sheet1!A3:B4` 设置包含验证条件为允许大于整数 10 的数据验证规则,选定单元格时显示输入信息,输入信息为: "input body": ![数据验证](https://www.xieys.club/images/posts/75e1f229eb0af622140ae65cce95a724.png) ![数据验证](https://www.xieys.club/images/posts/75e1f229eb0af622140ae65cce95a724.png) ``` dvRange = excelize.NewDataValidation(true) dvRange.Sqref = "A3:B4" dvRange.SetRange(10, 20, excelize.DataValidationTypeWhole, excelize.DataValidationOperatorGreaterThan) dvRange.SetInput("input title", "input body") f.AddDataValidation("Sheet1", dvRange) ``` 例3,为 `Sheet1!A5:B6` 设置验证条件为序列的数据验证规则,忽略空值并提供下拉箭头: ![数据验证](https://www.xieys.club/images/posts/ff8dbc114cb00d1af4c76b20002f9f7d.png) ![数据验证](https://www.xieys.club/images/posts/ff8dbc114cb00d1af4c76b20002f9f7d.png) ``` dvRange = excelize.NewDataValidation(true) dvRange.Sqref = "A5:B6" dvRange.SetDropList([]string{"1", "2", "3"}) f.AddDataValidation("Sheet1", dvRange) ``` 例4,为 `Sheet1!A7:B8` 设置以 `Sheet1!E1:E3` 为来源的验证条件,忽略空值并提供下拉箭头: ![数据验证](https://www.xieys.club/images/posts/cfeadd6c832a2639295850dcded329c2.png) ![数据验证](https://www.xieys.club/images/posts/cfeadd6c832a2639295850dcded329c2.png) ``` dvRange := excelize.NewDataValidation(true) dvRange.Sqref = "A7:B8" dvRange.SetSqrefDropList("E1:E3", true) f.AddDataValidation("Sheet1", dvRange) ``` ## 工具函数 ### 创建表格 ``` func (f *File) AddTable(sheet, hcell, vcell, format string) error ``` 根据给定的工作表名、单元格坐标区域和条件格式创建表格。 - 例1,在名为 `Sheet1` 的工作表 `A1:D5` 区域创建表格: ![创建表格](https://www.xieys.club/images/posts/3cae0b3dbe7599766cbe5dd24bad4c62.png) ![创建表格](https://www.xieys.club/images/posts/3cae0b3dbe7599766cbe5dd24bad4c62.png) ``` err := f.AddTable("Sheet1", "A1", "D5", ``) ``` - 例2,在名为 `Sheet2` 的工作表 `F2:H6` 区域创建带有条件格式的表格: ![创建带有条件格式的表格](https://www.xieys.club/images/posts/13233057efb680842c26703b95ddf018.png) ![创建带有条件格式的表格](https://www.xieys.club/images/posts/13233057efb680842c26703b95ddf018.png) ``` err := f.AddTable("Sheet2", "F2", "H6", `{"table_name":"table","table_style":"TableStyleMedium2", "show_first_column":true,"show_last_column":true,"show_row_stripes":false,"show_column_stripes":true}`) ``` 注意,表格坐标区域至少需要覆盖两行:字符型的标题行和内容行。多个表格的坐标区域不能有交集。 可选参数 `table_name` 用以设置自定义表格名称,同一个工作表内的表格名称应该是唯一的。 Excelize 支持的表格样式 `table_style` 参数: ``` TableStyleLight1 - TableStyleLight21 TableStyleMedium1 - TableStyleMedium28 TableStyleDark1 - TableStyleDark11 ``` ### 自动过滤器 ``` func (f *File) AutoFilter(sheet, hcell, vcell, format string) error ``` 根据给定的工作表名、单元格坐标区域和条件格式创建自动过滤器。Excel 中的自动过滤器可以对一些简单的二维数据数据进行数据筛选。 例1,在名称为 `Sheet1` 的工作表 `A1:D4` 区域创建自动过滤器: ![创建自动过滤器](https://www.xieys.club/images/posts/85c2b884ecac22825093bbbab2663a83.png) ![创建自动过滤器](https://www.xieys.club/images/posts/85c2b884ecac22825093bbbab2663a83.png) ``` err := f.AutoFilter("Sheet1", "A1", "D4", "") ``` 例2,在名称为 `Sheet1` 的工作表 `A1:D4` 区域创建带有格式条件的自动过滤器: ``` err := f.AutoFilter("Sheet1", "A1", "D4", `{"column":"B","expression":"x != blanks"}`) ``` 参数 `column` 指定了自动过滤器在过滤范围内的基准列。 Excelize 暂不支持自动过滤器的计算,在设置过滤条件后,如果需要隐藏任何不符合过滤条件的行,可以使用 [`SetRowVisible()`](https://xuri.me/excelize/zh-hans/sheet.html#SetRowVisible) 设置行的可见性。 为列设置过滤条件,参数 `expression` 用于指定过滤条件运算,支持下列运算符: ``` == != > < >= <= and or ``` 一个表达式可以包含一个或两个由 `and` 和 `or` 运算符分隔的语句。例如: ``` x < 2000 x > 2000 x == 2000 x > 2000 and x < 5000 x == 2000 or x == 5000 ``` 可以通过在表达式中使用空白或非空白值来实现空白或非空白数据的过滤: ``` x == Blanks x == NonBlanks ``` Office Excel 还允许一些简单的字符串匹配操作: ``` x == b* // 以 b 开始 x != b* // 不以 b 开始 x == *b // 以 b 结尾 x != *b // 不以 b 结尾 x == *b* // 包含 b x != *b* // 不包含 b ``` 我们还可以使用 `*` 来匹配任何字符或数字,用`?` 匹配任何单个字符或数字。除此之外,Office Excel 的自动过滤器不支持其他正则表达式的关键字。 Excel 的正则表达式字符可以使用 `~` 进行转义。 上述示例中的占位符变量 `x` 可以被任何简单的字符串替换。实际的占位符名称在内部被忽略,所以以下所有表达式的效果都是等同的: ``` x < 2000 col < 2000 Price < 2000 ``` ### 清除单元格缓存 ``` func (f *File) UpdateLinkedValue() error ``` Excel 会在保存时将保存带有公式的单元格的计算结果,这会导致在 Office Excel 2007 和 2010 中文档在打开时,即便计算因子已经发生变化,公式的计算结果不会自动更新。参考链接: https://social.technet.microsoft.com/Forums/office/en-US/e16bae1f-6a2c-4325-8013-e989a3479066/excel-2010-linked-cells-not-updating?forum=excel 此函数会将工作簿中所有缓存结果清除,这样文档在 Office Excel 中被重新打开时会自动计算新的公式结果,但是由于计算后文档发生了变化,在关闭文档时 Office Excel 会提示是否保存工作簿。 清除单元格缓存对工作簿的影响表现为对 `` 标签的修改,例如,清除前的单元格缓存: ``` SUM(Sheet2!D2,Sheet2!D11) 100 ``` 清除单元格缓存后: ``` SUM(Sheet2!D2,Sheet2!D11) ``` ### 单元格坐标切分 ``` func SplitCellName(cell string) (string, int, error) ``` 将工作表的单元格坐标切分为列名和行号。例如,将单元格坐标 `AK74` 切分为 `AK` 和 `74`: ``` excelize.SplitCellName("AK74") // return "AK", 74, nil ``` ### 单元格坐标组合 ``` func JoinCellName(col string, row int) (string, error) ``` 将列名和行号组合成工作表的单元格坐标。 ### 列名转索引 ``` func ColumnNameToNumber(name string) (int, error) ``` 将工作表的列名(大小写不敏感)转换为索引,对于错误的列名格式将返回错误。例如: ``` excelize.ColumnNameToNumber("AK") // returns 37, nil ``` ### 索引转列名 ``` func ColumnNumberToName(num int) (string, error) ``` 将数据类型为整型的索引转换为列名。例如: ``` 复制代码excelize.ColumnNumberToName(37) // returns "AK", nil ``` ### 单元格坐标转索引 ``` func CellNameToCoordinates(cell string) (int, int, error) ``` 将由字母和数字组合而成的单元格坐标转换为 `[X, Y]` 形式的行、列索引,或返回错误。例如: ``` 复制代码CellCoordinates("A1") // returns 1, 1, nilCellCoordinates("Z3") // returns 26, 3, nil ``` ### 索引转单元格坐标 ``` func CoordinatesToCellName(col, row int) (string, error) ``` 将 `[X, Y]` 形式的行、列索引转换为由字母和数字组合而成的单元格坐标,或返回错误。例如: ``` CoordinatesToCellName(1, 1) // returns "A1", nil ``` ### 创建条件格式样式 ``` func (f *File) NewConditionalStyle(style string) (int, error) ``` 通过给定样式为条件格式创建样式,样式参数与 [`NewStyle()`](https://xuri.me/excelize/zh-hans/style.html#NewStyle) 函数的相同。请注意,使用 RGB 色域颜色代码时,目前仅支持设置字体、填充、对齐和边框的颜色。 ### 设置条件格式 ``` func (f *File) SetConditionalFormat(sheet, area, formatSet string) error ``` 根据给定的工作表名称、单元格坐标区域和格式参数,为单元格值创建条件格式设置规则。条件格式是 Office Excel 的一项功能,它允许您根据特定条件将格式应用于单元格或一系列单元格。 格式参数 `type` 选项是必需的参数,它没有默认值。允许的类型值及其相关参数是: | 类型 | 参数 | | :------------ | :------- | | cell | criteria | | value | | | minimum | | | maximum | | | date | criteria | | value | | | minimum | | | maximum | | | time_period | criteria | | text | criteria | | value | | | average | criteria | | duplicate | (none) | | unique | (none) | | top | criteria | | value | | | bottom | criteria | | value | | | blanks | (none) | | no_blanks | (none) | | errors | (none) | | no_errors | (none) | | 2_color_scale | min_type | | max_type | | | min_value | | | max_value | | | min_color | | | max_color | | | 3_color_scale | min_type | | mid_type | | | max_type | | | min_value | | | mid_value | | | max_value | | | min_color | | | mid_color | | | max_color | | | data_bar | min_type | | max_type | | | min_value | | | max_value | | | bar_color | | | formula | criteria | `criteria` 参数用于设置单元格数据的条件格式运算符。它没有默认值,同常与 `{"type":"cell"}` 一起使用,支持的参数为: | 文本描述字符 | 符号表示 | | :----------------------- | :------- | | between | | | not between | | | equal to | == | | not equal to | != | | greater than | > | | less than | < | | greater than or equal to | >= | | less than or equal to | <= | 可以使用上面表格第一列中的 Office Excel 文本描述字符,或者符号表示方法(`between` 与 `not between` 没有符号表示法)作为条件格式运算符。 下面的相关部分显示了其他条件格式类型的特定标准。 `value`:该值通常与 `criteria` 参数一起使用,可以用确定的值作为设置单元格条件格式的条件参数: ``` f.SetConditionalFormat("Sheet1", "D1:D10", fmt.Sprintf(`[{"type":"cell","criteria":">","format":%d,"value":"6"}]`, format)) ``` `value` 属性也可以是单元格引用: ``` f.SetConditionalFormat("Sheet1", "D1:D10", fmt.Sprintf(`[{"type":"cell","criteria":">","format":%d,"value":"$C$1"}]`, format)) ``` 类型:`format` - `format` 参数用于指定满足条件格式标准时将应用于单元格的格式。该参数可以通过 [`NewConditionalStyle()`](https://xuri.me/excelize/zh-hans/utils.html#NewConditionalStyle) 方法来创建: ``` format, err = f.NewConditionalStyle(`{"font":{"color":"#9A0511"},"fill":{"type":"pattern","color":["#FEC7CE"],"pattern":1}}`) if err != nil { fmt.Println(err) } f.SetConditionalFormat("Sheet1", "A1:A10", fmt.Sprintf(`[{"type":"cell","criteria":">","format":%d,"value":"6"}]`, format)) ``` 注意:在 Office Excel 中,条件格式叠加在现有单元格格式上,并非所有单元格格式属性都可以修改。无法在条件格式中修改的属性包括:字体名称、字体大小、上标和下标、对角边框、所有对齐属性和所有保护属性。 Office Excel 中内置了一些与条件格式一起使用的默认样式。可以使用以下 excelize 设置实现这些样式效果: ``` // 浅红填充色深色文本代表较差 format1, err = f.NewConditionalStyle(`{"font":{"color":"#9A0511"},"fill":{"type":"pattern","color":["#FEC7CE"],"pattern":1}}`) // 黄填充色深黄色文本代表一般 format2, err = f.NewConditionalStyle(`{"font":{"color":"#9B5713"},"fill":{"type":"pattern","color":["#FEEAA0"],"pattern":1}}`) // 绿填充色深绿色文本代表较好 format3, err = f.NewConditionalStyle(`{"font":{"color":"#09600B"},"fill":{"type":"pattern","color":["#C7EECF"],"pattern":1}}`) ``` 类型:`minimum` - 当条件格式 `criteria` 为 `between` 或 `not between` 时,`minimum` 参数用于设置下限值。 ``` // 高亮单元格条件格式规则: between... f.SetConditionalFormat("Sheet1", "A1:A10", fmt.Sprintf(`[{"type":"cell","criteria":"between","format":%d,"minimum":"6","maximum":"8"}]`, format)) ``` 类型:`maximum` - 当条件格式 `criteria` 为 `between` 或 `not between` 时,`maximum` 参数用于设置上限值,参考上面的例子。 类型:`average` - 平均类型用于指定 Office Excel “最前最后规则”中“经典”样式的“仅高于或低于平均值的数值设置格式”条件格式: ``` // 最前最后规则:高于平均值... f.SetConditionalFormat("Sheet1", "A1:A10", fmt.Sprintf(`[{"type":"average","criteria":"=","format":%d, "above_average": true}]`, format1)) // 最前最后规则:低于平均值... f.SetConditionalFormat("Sheet1", "B1:B10", fmt.Sprintf(`[{"type":"average","criteria":"=","format":%d, "above_average": false}]`, format2)) ``` 类型:`duplicate` - 用于设置“突出显示单元格规则”中的“重复值 …”: ``` // 突出显示单元格规则: 重复值... f.SetConditionalFormat("Sheet1", "A1:A10", fmt.Sprintf(`[{"type":"duplicate","criteria":"=","format":%d}]`, format)) ``` 类型:`unique` - 用于设置“突出显示单元格规则”中“只为以下内容的单元格设置格式”的“特定文本”: ``` // 突出显示单元格规则,只为以下内容的单元格设置格式: 特定文本 不等于... f.SetConditionalFormat("Sheet1", "A1:A10", fmt.Sprintf(`[{"type":"unique","criteria":"=","format":%d}]`, format)) ``` 类型:`top` - 用于设置“最前最后规则”中的“前 10 项…”或“前 10% …”: ``` // 最前最后规则: 前 10 项... f.SetConditionalFormat("Sheet1", "H1:H10", fmt.Sprintf(`[{"type":"top","criteria":"=","format":%d,"value":"6"}]`, format)) ``` 设置带有百分比条件的条件格式: ``` f.SetConditionalFormat("Sheet1", "A1:A10", fmt.Sprintf(`[{"type":"top","criteria":"=","format":%d,"value":"6","percent":true}]`, format)) ``` 类型:`2_color_scale` - 用于设置带有“双色刻度”的“色阶样式”条件格式 ``` // 色阶:双色刻度 f.SetConditionalFormat("Sheet1", "A1:A10", `[{"type":"2_color_scale","criteria":"=","min_type":"min","max_type":"max","min_color":"#F8696B","max_color":"#63BE7B"}]`) ``` 双色刻度色阶条件格式可选参数:`min_type`、`max_type`、`min_value`、`max_value`、`min_color` 和 `max_color`。 类型:`3_color_scale` - 用于设置带有“三色刻度”的“色阶样式”条件格式: ``` // 色阶:三色刻度 f.SetConditionalFormat("Sheet1", "A1:A10", `[{"type":"3_color_scale","criteria":"=","min_type":"min","mid_type":"percentile","max_type":"max","min_color":"#F8696B","mid_color":"#FFEB84","max_color":"#63BE7B"}]`) ``` 三色刻度色阶条件格式可选参数: `min_type`、`mid_type`、`max_type`、`min_value`、`mid_value`、`max_value`、`min_color`、`mid_color` 和 `max_color`。 类型:`data_bar` - 用于设置“数据条”类型的条件格式。 `min_type` - 参数 `min_type` 在条件格式类型为 `2_color_scale`、`3_color_scale` 或 `data_bar` 时可用。参数 `mid_type` 在条件格式类型为 `3_color_scale` 时可用。例如: ``` // 数据条:渐变填充 f.SetConditionalFormat("Sheet1", "K1:K10", `[{"type":"data_bar", "criteria":"=", "min_type":"min","max_type":"max","bar_color":"#638EC6"}]`) ``` 参数 `min/mid/max_types` 可选值列表: | 参数 | 类型 | | :--------- | :-------------------------- | | min | 最低值(仅用于 `min_type`) | | num | 数字 | | percent | 百分比 | | percentile | 百分点值 | | formula | 公式 | | max | 最高值(仅用于 `max_type`) | `mid_type` - 当条件格式类型为 `3_color_scale` 时使用,与 `min_type` 用法相同,参考上面的表格。 `max_type` - 与 `min_type` 用法相同,参考上面的表格。 `min_value` - 参数 `min_value` 和 `max_value` 在条件格式类型为 `2_color_scale`、`3_color_scale` 或 `data_bar` 时可用。参数 `mid_value` 在条件格式类型为 `3_color_scale` 时可用。 `mid_value` - 在条件格式类型为 `3_color_scale` 时可用,与 `min_value` 的用法相同,参考上述文档。 `max_value` - 与 `min_value` 的用法相同,参考上述文档。 `min_color` - 参数 `min_color` 和 `max_color` 在条件格式类型为 `2_color_scale`、`3_color_scale` 或 `data_bar` 时可用。参数 `mid_color` 在条件格式类型为 `3_color_scale` 时可用。例如: ``` // 色阶:三色刻度 f.SetConditionalFormat("Sheet1", "B1:B10", `[{"type":"3_color_scale","criteria":"=","min_type":"min","mid_type":"percentile","max_type":"max","min_color":"#F8696B","mid_color":"#FFEB84","max_color":"#63BE7B"}]`) ``` `mid_color` - 当条件格式类型为 `3_color_scale` 时使用。与 `min_color` 用法相同,参考上述文档。 `max_color` - 与 `min_color` 用法相同,参考上述文档。 `bar_color` - 当条件格式类型为 `data_bar` 时使用。与 `min_color` 用法相同,参考上述文档。 ### 设置窗格 ``` func (f *File) SetPanes(sheet, panes string) ``` 通过给定的工作表名称和窗格样式参数设置冻结窗格或拆分窗格。 `activePane` 定义了活动窗格,下表为该属性的可选值: | 枚举值 | 描述 | | :------------------------------ | :----------------------------------------------------------- | | bottomLeft (Bottom Left Pane) | 当应用垂直和水平分割时,位于左下方的窗格。此值也适用于仅应用了水平分割的情况,将窗格分为上下两个区域。在这种情况下,该值指定底部窗格。 | | bottomRight (Bottom Right Pane) | 当垂直和水平时,位于底部右侧的窗格。 | | topLeft (Top Left Pane) | 当应用垂直和水平分割时,位于左上方的窗格。此值也适用于仅应用了水平分割的情况,将窗格分为上下两个区域。在这种情况下,该值指定顶部窗格。此值也适用于仅应用垂直分割的情况,将窗格分割为右侧和左侧区域。在这种情况下,该值指定左侧窗格。 | | topRight (Top Right Pane) | 当应用垂直和水平分割时,位于右上方窗格。 此值也适用于仅应用垂直分割的情况,将窗格分割为右侧和左侧区域。在这种情况下,该值指定右侧窗格。 | 窗格状态类型仅限于下表中当前列出的受支持的值: | 枚举值 | 描述 | | :-------------- | :----------------------------------------------------------- | | frozen (Frozen) | 窗格被冻结,但并不分裂。在此状态下,当窗格被解除冻结然后再次解冻时,会生成单个窗格,而不会被分割。在这种状态下,分割条不可调节。 | | split (Split) | 窗格被分裂,但并不冻结。在此状态下,用户可以调整分割条。 | `x_split` - 水平分割点的位置。如果窗格冻结,则此值用于设置顶部窗格中可见的列数。 `y_split` - 垂直分割点的位置。如果窗格冻结,则此值用于设置左侧窗格中可见的行数。该属性的可能值由 W3C XML Schema double 数据类型定义。 `top_left_cell` - 处于“从左到右”模式时,右下方窗格中左上角可见单元格的位置。 `sqref` - 参考单元格坐标区域。可以是非连续的一组单元格坐标区域。 例1,在名为 `Sheet1` 的工作表上冻结列 `A` 并设置活动单元格 `Sheet1!K16`: ![冻结列](https://www.xieys.club/images/posts/f3d2e23f0045c60f2dc8ba04fd6b7bc9.png) ![冻结列](https://www.xieys.club/images/posts/f3d2e23f0045c60f2dc8ba04fd6b7bc9.png) ``` f.SetPanes("Sheet1", `{"freeze":true,"split":false,"x_split":1,"y_split":0,"top_left_cell":"B1","active_pane":"topRight","panes":[{"sqref":"K16","active_cell":"K16","pane":"topRight"}]}`) ``` 例2,在名为 `Sheet1` 的工作表上冻结第 1 到第 9 行,并设置活动单元格区域 `Sheet1!A11:XFD11`: ![冻结列并设置活动单元格区域](https://www.xieys.club/images/posts/04c3025e70a2c3729cb42f848ef2fad5.png) ![冻结列并设置活动单元格区域](https://www.xieys.club/images/posts/04c3025e70a2c3729cb42f848ef2fad5.png) ``` f.SetPanes("Sheet1", `{"freeze":true,"split":false,"x_split":0,"y_split":9,"top_left_cell":"A34","active_pane":"bottomLeft","panes":[{"sqref":"A11:XFD11","active_cell":"A11","pane":"bottomLeft"}]}`) ``` 例3,在名为 `Sheet1` 的工作表上创建拆分窗格,并设置活动单元格 `Sheet1!J60`: ![创建拆分窗格](https://www.xieys.club/images/posts/8cd485f53ec2e3fbf9246a777473d02b.png) ![创建拆分窗格](https://www.xieys.club/images/posts/8cd485f53ec2e3fbf9246a777473d02b.png) ``` f.SetPanes("Sheet1", `{"freeze":false,"split":true,"x_split":3270,"y_split":1800,"top_left_cell":"N57","active_pane":"bottomLeft","panes":[{"sqref":"I36","active_cell":"I36"},{"sqref":"G33","active_cell":"G33","pane":"topRight"},{"sqref":"J60","active_cell":"J60","pane":"bottomLeft"},{"sqref":"O60","active_cell":"O60","pane":"bottomRight"}]}`) ``` 例4,解冻并删除名为 `Sheet1` 上的所有窗格: ``` f.SetPanes("Sheet1", `{"freeze":false,"split":false}`) ``` ### 色值计算 ``` func ThemeColor(baseColor string, tint float64) string ``` 通过给定的 RGB 格式色值与色调参数,计算出最终颜色。例如,获取名为 `Sheet1` 的工作表 `A1` 单元格的背景颜色: ``` package main import ( "fmt" "github.com/360EntSecGroup-Skylar/excelize" ) func main() { f, _ := excelize.OpenFile("Book1.xlsx") fmt.Println(getCellBgColor(f, "Sheet1", "C1")) } func getCellBgColor(f *excelize.File, sheet, axix string) string { styleID := f.GetCellStyle(sheet, axix) fillID := f.Styles.CellXfs.Xf[styleID].FillID fgColor := f.Styles.Fills.Fill[fillID].PatternFill.FgColor if fgColor.Theme != nil { srgbClr := f.Theme.ThemeElements.ClrScheme.Children[*fgColor.Theme].SrgbClr.Val return excelize.ThemeColor(srgbClr, fgColor.Tint) } return fgColor.RGB } ``` ### RGB与HSL色彩空间色值转换 ``` func RGBToHSL(r, g, b uint8) (h, s, l float64) ``` 该函数提供方法将 RGB 色彩空间三元组转换为 HSL 色彩空间三元组。 ### HSL与RGB色彩空间色值转换 ``` func HSLToRGB(h, s, l float64) (r, g, b uint8) ``` 该函数提供方法将 HSL 色彩空间三元组转换为 RGB 色彩空间三元组。 ## 文件 Writer ### Write ``` func (f *File) Write(w io.Writer) error ``` 该函数提供方法将当前文件内容写入给定的 `io.Writer`。 ### WriteTo ``` func (f *File) WriteTo(w io.Writer) (int64, error) ``` 该函数通过实现 `io.WriterTo` 以保存文件。 ### WriteToBuffer ``` func (f *File) WriteToBuffer() (*bytes.Buffer, error) ``` 该函数提供获取当前文件内容 `*bytes.Buffer` 的方法。 # 常量 以下这些常量定义了当前支持的图表类型: ``` const ( Bar = "bar" BarStacked = "barStacked" BarPercentStacked = "barPercentStacked" Bar3DClustered = "bar3DClustered" Bar3DStacked = "bar3DStacked" Bar3DPercentStacked = "bar3DPercentStacked" Col = "col" ColStacked = "colStacked" ColPercentStacked = "colPercentStacked" Col3DClustered = "col3DClustered" Col3D = "col3D" Col3DStacked = "col3DStacked" Col3DPercentStacked = "col3DPercentStacked" Doughnut = "doughnut" Line = "line" Pie = "pie" Pie3D = "pie3D" Radar = "radar" Scatter = "scatter" ) ``` 以下这些常量定义了 XML 标签的命名空间: ``` const ( SourceRelationship = "http://schemas.openxmlformats.org/officeDocument/2006/relationships" SourceRelationshipChart = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart" SourceRelationshipComments = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments" SourceRelationshipImage = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" SourceRelationshipTable = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/table" SourceRelationshipDrawingML = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing" SourceRelationshipDrawingVML = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing" SourceRelationshipHyperLink = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" SourceRelationshipWorkSheet = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" SourceRelationshipChart201506 = "http://schemas.microsoft.com/office/drawing/2015/06/chart" SourceRelationshipChart20070802 = "http://schemas.microsoft.com/office/drawing/2007/8/2/chart" SourceRelationshipChart2014 = "http://schemas.microsoft.com/office/drawing/2014/chart" SourceRelationshipCompatibility = "http://schemas.openxmlformats.org/markup-compatibility/2006" NameSpaceDrawingML = "http://schemas.openxmlformats.org/drawingml/2006/main" NameSpaceDrawingMLChart = "http://schemas.openxmlformats.org/drawingml/2006/chart" NameSpaceDrawingMLSpreadSheet = "http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing" NameSpaceSpreadSheet = "http://schemas.openxmlformats.org/spreadsheetml/2006/main" NameSpaceXML = "http://www.w3.org/XML/1998/namespace" ) ``` 下面的常量定义了 EMU (English Metric Units) 单位: ``` const ( EMU int = 9525) ``` 下面的常量定义了 XML 文档中的独立声明: ``` const XMLHeader = "\n" ``` 以下这些常量定义了当前支持的数据验证类型: ``` const ( DataValidationTypeCustom DataValidationTypeDate DataValidationTypeDecimal DataValidationTypeTextLeng DataValidationTypeTime DataValidationTypeWhole ) ``` 以下这些常量定义了当前支持的数据验证条件: ``` const ( DataValidationOperatorBetween DataValidationOperatorEqual DataValidationOperatorGreaterThan DataValidationOperatorGreaterThanOrEqual DataValidationOperatorLessThan DataValidationOperatorLessThanOrEqual DataValidationOperatorNotBetween DataValidationOperatorNotEqual ) ```