一架梯子,一头程序猿,仰望星空!
Go Excelize教程 > 内容正文

Go Excelize 单元格


单元格

RichTextRun 定义了富文本的属性。

type RichTextRun struct {
    Font *Font
    Text string
}

HyperlinkOpts 用来指定可选的超链接属性,例如要显示的文字与屏幕提示文字。

type HyperlinkOpts struct {
    Display *string
    Tooltip *string
}

FormulaOpts 用于在 SetCellFormula 函数中指定设置特殊公式类型。

type FormulaOpts struct {
    Type *string // 公式类型
    Ref  *string // 共享公式引用
}

设置单元格的值

func (f *File) SetCellValue(sheet, cell string, value interface{}) error

根据给定的工作表名和单元格坐标设置单元格的值。此功能是并发安全的。指定的坐标不应在表格的第一行范围,使用字符文本设置复数。

支持的数据类型
int
int8
int16
int32
int64
uint
uint8
uint16
uint32
uint64
float32
float64
string
[]byte
time.Duration
time.Time
bool
nil

请注意,此函数默认为 time.Time 类型的单元格的值设置 m/d/yy h:mm 数字格式,您可通过 SetCellStyle 更改该设置。若您需设置无法通过 Go 语言 time.Time 类型表示的 Excel 特殊日期,例如 1900 年 1 月 0 日或 1900 年 2 月 29 日,请先设置单元格的值为 0 或 60,再为其设置具有日期数字格式的样式。

设置布尔型值

func (f *File) SetCellBool(sheet, cell string, value bool) error

根据给定的工作表名和单元格坐标设置布尔型单元格的值。

设置默认字符型值

func (f *File) SetCellDefault(sheet, cell, value string) error

根据给定的工作表名和单元格坐标设置字符型单元格的值,字符将不会进行特殊字符过滤。

设置整数

func (f *File) SetCellInt(sheet, cell string, value int) error

根据给定的工作表名和单元格坐标设置整数型单元格的值。

设置浮点数

func (f *File) SetCellFloat(sheet, cell string, value float64, precision, bitSize int) error

根据给定的工作表名、单元格坐标、浮点数、浮点数尾数部分精度和浮点数类型设置浮点型单元格的值。

设置字符型值

func (f *File) SetCellStr(sheet, cell, value string) error

根据给定的工作表名和单元格坐标设置字符型单元格的值,字符将会进行特殊字符过滤,并且字符串的累计长度应不超过 32767,多余的字符将会被忽略。

设置单元格样式

func (f *File) SetCellStyle(sheet, hCell, vCell string, styleID int) error

根据给定的工作表名、单元格坐标区域和样式索引设置单元格的值。此功能是并发安全的。样式索引可以通过 NewStyle 函数获取。注意,在同一个坐标区域内的 diagonalDowndiagonalUp 需要保持颜色一致。SetCellStyle 将覆盖单元格的已有样式,而不会将样式与已有样式叠加或合并。

  • 例1,为名为 Sheet1 的工作表 D7 单元格设置边框样式:
style, err := f.NewStyle(&excelize.Style{
    Border: []excelize.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: 8},
        {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(&excelize.Style{
    Fill: excelize.Fill{Type: "gradient", Color: []string{"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(&excelize.Style{
    Fill: excelize.Fill{Type: "pattern", Color: []string{"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(&excelize.Style{
    Alignment: &excelize.Alignment{
        Horizontal:      "center",
        Indent:          1,
        JustifyLastLine: true,
        ReadingOrder:    0,
        RelativeIndent:  1,
        ShrinkToFit:     true,
        TextRotation:    45,
        Vertical:        "",
        WrapText:        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(&excelize.Style{NumFmt: 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(&excelize.Style{
    Font: &excelize.Font{
        Bold:   true,
        Italic: true,
        Family: "Times New Roman",
        Size:   36,
        Color:  "777777",
    },
})
if err != nil {
    fmt.Println(err)
}
err = f.SetCellStyle("Sheet1", "D7", "D7", style)

为单元格设置字体、字号、颜色和倾斜样式

  • 例7,锁定并隐藏名为 Sheet1 的工作表 D7 单元格:
style, err := f.NewStyle(&excelize.Style{
    Protection: &excelize.Protection{
        Hidden: true,
        Locked: true,
    },
})
if err != nil {
    fmt.Println(err)
}
err = f.SetCellStyle("Sheet1", "D7", "D7", style)

要锁定单元格或隐藏公式,请保护工作表。在“审阅”选项卡上,单击“保护工作表”。

设置超链接

func (f *File) SetCellHyperLink(sheet, cell, link, linkType string, opts ...HyperlinkOpts) error

根据给定的工作表、单元格坐标、链接资源和资源类型设置单元格的超链接。资源类型分为外部链接地址 External 和工作簿内部位置链接 Location 两种。每个工作表中的包含最大超链接限制为 65530 个。该方法仅设置单元格的超链接而不影响单元格的值,若需设置单元格的值,请通过 SetCellStyleSetSheetRow 等函数另行设置。

  • 例1,为名为 Sheet1 的工作表 A3 单元格添加外部链接:
display, tooltip := "https://github.com/xuri/excelize", "Excelize on GitHub"
if err := f.SetCellHyperLink("Sheet1", "A3",
    "https://github.com/xuri/excelize", "External", excelize.HyperlinkOpts{
        Display: &display,
        Tooltip: &tooltip,
    }); err != nil {
    fmt.Println(err)
}
// 为单元格设置字体和下划线样式
style, err := f.NewStyle(&excelize.Style{
    Font: &excelize.Font{Color: "1265BE", Underline: "single"},
})
if err != nil {
    fmt.Println(err)
}
err = f.SetCellStyle("Sheet1", "A3", "A3", style)
  • 例2,为名为 Sheet1 的工作表 A3 单元格添加内部位置链接:
err := f.SetCellHyperLink("Sheet1", "A3", "Sheet1!A40", "Location")

设置富文本格式

func (f *File) SetCellRichText(sheet, cell string, runs []RichTextRun) error

根据给定的工作表、单元格坐标和富文本格式为指定单元格设置富文本。

例如,在名为 Sheet1 的工作表 A1 单元格设置富文本格式:

设置富文本格式

package main

import (
    "fmt"

    "github.com/xuri/excelize/v2"
)

func main() {
    f := excelize.NewFile()
    defer func() {
        if err := f.Close(); err != nil {
            fmt.Println(err)
        }
    }()
    if err := f.SetRowHeight("Sheet1", 1, 35); err != nil {
        fmt.Println(err)
        return
    }
    if err := f.SetColWidth("Sheet1", "A", "A", 44); err != nil {
        fmt.Println(err)
        return
    }
    if err := f.SetCellRichText("Sheet1", "A1", []excelize.RichTextRun{
        {
            Text: "bold",
            Font: &excelize.Font{
                Bold:   true,
                Color:  "2354E8",
                Family: "Times New Roman",
            },
        },
        {
            Text: " and ",
            Font: &excelize.Font{
                Family: "Times New Roman",
            },
        },
        {
            Text: "italic ",
            Font: &excelize.Font{
                Bold:   true,
                Color:  "E83723",
                Italic: true,
                Family: "Times New Roman",
            },
        },
        {
            Text: "text with color and font-family,",
            Font: &excelize.Font{
                Bold:   true,
                Color:  "2354E8",
                Family: "Times New Roman",
            },
        },
        {
            Text: "\r\nlarge text with ",
            Font: &excelize.Font{
                Size:  14,
                Color: "AD23E8",
            },
        },
        {
            Text: "strike",
            Font: &excelize.Font{
                Color:  "E89923",
                Strike: true,
            },
        },
        {
            Text: " superscript",
            Font: &excelize.Font{
                Color:     "DBC21F",
                VertAlign: "superscript",
            },
        },
        {
            Text: " and ",
            Font: &excelize.Font{
                Size:      14,
                Color:     "AD23E8",
                VertAlign: "baseline",
            },
        },
        {
            Text: "underline",
            Font: &excelize.Font{
                Color:     "23E833",
                Underline: "single",
            },
        },
        {
            Text: " subscript.",
            Font: &excelize.Font{
                Color:     "017505",
                VertAlign: "subscript",
            },
        },
    }); err != nil {
        fmt.Println(err)
        return
    }
    style, err := f.NewStyle(&excelize.Style{
        Alignment: &excelize.Alignment{
            WrapText: true,
        },
    })
    if err != nil {
        fmt.Println(err)
        return
    }
    if err := f.SetCellStyle("Sheet1", "A1", "A1", style); err != nil {
        fmt.Println(err)
        return
    }
    if err := f.SaveAs("Book1.xlsx"); err != nil {
        fmt.Println(err)
    }
}

获取富文本格式

func (f *File) GetCellRichText(sheet, cell string) ([]RichTextRun, error)

根据给定的工作表、单元格坐标获取指定单元格的富文本格式。

获取单元格的值

func (f *File) GetCellValue(sheet, cell string, opts ...Options) (string, error)

根据给定的工作表和单元格坐标获取单元格的值,返回值将转换为 string 类型。如果可以将单元格格式应用于单元格的值,将返回应用后的值,否则将返回原始值。合并区域内所有单元格的值都相同。此功能是并发安全的。

获取单元格数据类型

func (f *File) GetCellType(sheet, cell string) (CellType, error)

根据给定的工作表、单元格坐标获取指定单元格的数据类型。

按列获取全部单元格的值

func (f *File) GetCols(sheet string, opts ...Options) ([][]string, error)

根据给定的工作表名按列获取该工作表上全部单元格的值,以二维数组形式返回,其中单元格的值将转换为 string 类型。如果可以将单元格格式应用于单元格的值,将使用应用后的值,否则将使用原始值。

例如,按列获取并遍历输出名为 Sheet1 的工作表上的所有单元格的值:

cols, err := f.GetCols("Sheet1")
if err != nil {
    fmt.Println(err)
    return
}
for _, col := range cols {
    for _, rowCell := range col {
        fmt.Print(rowCell, "\t")
    }
    fmt.Println()
}

按行获取全部单元格的值

func (f *File) GetRows(sheet string, opts ...Options) ([][]string, error)

根据给定的工作表名按行获取该工作表上全部单元格的值,以二维数组形式返回,其中单元格的值将转换为 string 类型。如果可以将单元格格式应用于单元格的值,将使用应用后的值,否则将使用原始值。GetRows 获取带有值或公式单元格的行,行尾连续为空的单元格将被跳过,每行中的单元格数目可能不同。

例如,按行获取并遍历输出名为 Sheet1 的工作表上的所有单元格的值:

rows, err := f.GetRows("Sheet1")
if err != nil {
    fmt.Println(err)
    return
}
for _, row := range rows {
    for _, colCell := range row {
        fmt.Print(colCell, "\t")
    }
    fmt.Println()
}

获取超链接

func (f *File) GetCellHyperLink(sheet, cell string) (bool, string, error)

根据给定的工作表名和单元格坐标获取单元格超链接,如果该单元格存在超链接,将返回 true 和链接地址,否则将返回 false 和空的链接地址。

例如,获取名为 Sheet1 的工作表上坐标为 H6 单元格的超链接:

link, target, err := f.GetCellHyperLink("Sheet1", "H6")

获取样式索引

func (f *File) GetCellStyle(sheet, cell string) (int, error)

根据给定的工作表名和单元格坐标获取单元格样式索引,获取到的索引可以在设置单元格样式时,作为调用 SetCellStyle 函数的参数使用。

合并单元格

func (f *File) MergeCell(sheet, hCell, vCell string) error

根据给定的工作表名和单元格坐标区域合并单元格。合并区域内仅保留左上角单元格的值,其他单元格的值将被忽略。例如,合并名为 Sheet1 的工作表上 D3:E9 区域内的单元格:

err := f.MergeCell("Sheet1", "D3", "E9")

如果给定的单元格坐标区域与已有的其他合并单元格相重叠,已有的合并单元格将会被删除。

取消合并单元格

func (f *File) UnmergeCell(sheet string, hCell, vCell string) error

根据给定的工作表名和单元格坐标区域取消合并单元格。例如,取消合并名为 Sheet1 的工作表上 D3:E9 区域内的单元格:

err := f.UnmergeCell("Sheet1", "D3", "E9")

如果给定的单元格坐标区域包含多个合并单元格,则全部合并单元格都将被取消合并。

获取合并单元格

根据给定的工作表名获取全部合并单元格的坐标区域和值。

func (f *File) GetMergeCells(sheet string) ([]MergeCell, error)

获取合并单元格的值

func (m *MergeCell) GetCellValue() string

GetCellValue 返回合并单元格的值。

获取合并单元格区域左上角单元格坐标

func (m *MergeCell) GetStartAxis() string

GetStartAxis 返回合并单元格区域左上角单元格的坐标,例如:C2

获取合并单元格区域右下角单元格坐标

func (m *MergeCell) GetEndAxis() string

GetEndAxis 返回合并单元格区域右下角单元格的坐标,例如:D4

添加批注

func (f *File) AddComment(sheet string, comment Comment) error

根据给定的工作表名称、单元格坐标和样式参数(作者与文本信息)添加批注。作者信息最大长度为 255 个字符,最大文本内容长度为 32512 个字符,超出该范围的字符将会被忽略。例如,为 Sheet1!$A$3 单元格添加批注:

在 Excel 文档中添加批注

err := f.AddComment("Sheet1", excelize.Comment{
    Cell:   "A3",
    Author: "Excelize",
    Paragraph: []excelize.RichTextRun{
        {Text: "Excelize: ", Font: &excelize.Font{Bold: true}},
        {Text: "This is a comment."},
    },
})

获取批注

func (f *File) GetComments(sheet string) ([]Comment, error)

根据给定的工作表名称获取工作表中的所有单元格批注。

删除批注

func (f *File) DeleteComment(sheet, cell string) error

根据给定的工作表名称、单元格坐标删除批注。例如,删除 Sheet1!$A$30 单元格批注:

err := f.DeleteComment("Sheet1", "A30")