注册 登录

清河洛

Go语言中的EXCEL表格操作

qingheluo2022-06-30清河洛934
excelize库是Go语言编写的用于操作Excel文档基础库,可以使用它来读取、写入由Excel2007及以上版本创建的电子表格文档安装:go get github.com/xuri/excelize/v2进行安装引用:import "github.com/xuri/excelize/v2"包级函数列名和列索引转换 列名转索引:ColumnNameToNumber(name string) (int, error) 索引转列名:ColumnNumberToName(num int) (string, error) 单元格坐标相关 单元格坐标为excel中单元格的表示方式,如"A4","...

excelize库是Go语言编写的用于操作Excel文档基础库,可以使用它来读取、写入由Excel2007及以上版本创建的电子表格文档

安装:go get github.com/xuri/excelize/v2进行安装

引用:import "github.com/xuri/excelize/v2"

包级函数

列名和列索引转换

列名转索引:ColumnNameToNumber(name string) (int, error)
索引转列名:ColumnNumberToName(num int) (string, error)

单元格坐标相关

单元格坐标为excel中单元格的表示方式,如"A4","G7","AS34"

切分单元格坐标:SplitCellName(cell string) (string, int, error)
组合单元格坐标:JoinCellName(col string, row int) (string, error)
坐标转为列和行的索引:CellNameToCoordinates(cell string) (int, int, error)

颜色转换

RGB转换为HSL:RGBToHSL(r, g, b uint8) (h, s, l float64)
HSL转换为RGB:HSLToRGB(h, s, l float64) (r, g, b uint8)

日期时间转换:ExcelDateToTime(excelDate float64, use1904Format bool) (time.Time, error)

将Excel中以float类型表示的日期转换为time.Time类型

工作簿实例

excelize中所有相关操作方法都是基于工作簿实例对象的

创建新文档:excelize.NewFile(opts ...Options) *File

打开文档:OpenFile(filename string, opts ...Options) (*File, error)

打开数据流:OpenReader(r io.Reader, opts ...Options) (*File, error)

Options为一个结构体,该结构体的定义
type Options struct {
    MaxCalcIterations uint
    Password          string
    RawCellValue      bool
    UnzipSizeLimit    int64
    UnzipXMLSizeLimit int64
}
MaxCalcIterations,指定计算公式时最多迭代次数,默认0
Password,打开或保存工作簿时的密码,默认为空
RawCellValue,读取单元格值时是否获取原始值,默认false
UnzipSizeLimit,指定打开文档时的解压缩大小限制(字节),默认为16GB
UnzipXMLSizeLimit,指定解压每个工作表以及共享字符表时的内存限制(字节),默认为16MB
    当超过此值时工作表XML文件将被解压至系统临时目录

文档相关操作

设置文档应用属性:SetAppProps(*AppProperties)

获取文档应用属性:GetAppProps()(*AppProperties, error)

Application:string,创建此文档的应用程序名称
ScaleCrop:bool,    文档缩略图是否保存原图,为false会进行裁切
DocSecurity:int8,表示文档安全级别
    1,文档受密码保护
    2,建议以只读方式打开文档
    3,强制以只读方式打开文档
    4,文档批注被锁定
Company:string,与文档关联的公司名称
LinksUpToDate:bool,文档中超链接是否最新。true表示超链接已更新,false表示超链接已过时
HyperlinksChanged:bool,指定下一次打开文档时是否更新超链接
AppVersion:string,指定生成此文档的应用程序的版本。应为XX.YYYY格式

设置文档属性:SetDocProps(*DocProperties) error

获取文档属性:GetDocProps() (*DocProperties, error)

所有字段都为string类型
    Category:文档内容的分类
    ContentStatus:文档内容的状态。值可能包括"Draft"、"Reviewed"和"Final"
    Created:文档创建时间(ISO 8601 UTC 时间格式),如 2019-06-04T22:00:10Z
    Creator:创作者
    Description:资源内容的说明
    Identifier:对给定上下文中的资源的明确引用
    Keywords:文档关键词
    Language:文档内容的主要语言
    LastModifiedBy:执行上次修改的用户
    Modified:文档修改时间
    Revision:文档修订版本
    Subject:文档主题
    Title:文档标题
    Version:版本号

保护工作簿:ProtectWorkbook(opts *WorkbookProtectionOptions) error

取消保护工作簿:UnprotectWorkbook(password ...string) error

type WorkbookProtectionOptions struct {
    AlgorithmName string
    Password      string
    LockStructure bool
    LockWindows   bool
}
AlgorithmName  使用的哈希算法
    支持XOR(默认)、MD4、MD5、SHA-1、SHA-256、SHA-384 或 SHA-512

注意,该方法并非添加打开文档时的密码保护,是保护文档中的工作表
当LockStructure为true时,无法修改、新建、移动工作表
LockWindows暂未测试出有何功能

设置默认字体:SetDefaultFont(fontName),实测无效

获取默认字体:GetDefaultFont() string

清除所有单元格缓存:UpdateLinkedValue() error

EXCEL默认会在保存文档时将所有带有公示的单元格计算结果进行缓存,会导致下次打开文档时即使数据发生改变也不会自动进行更新
清除缓存将强制在下次打开时自动计算新的公式结果

Excel实际数据是保存在xml文件中,在xml文件中的缓存表现为
<row r="19">
    <c r="B19">
        <f>SUM(Sheet2!D2,Sheet2!D11)</f>
        <v>100</v>
     </c>
</row>
v标签的值就是缓存
清除缓存会删除所有的v标签

保存文档:Save(opts ...Options) error

另存文档:SaveAs(FileName, opts ...Options) error

关闭打开的文档: Close() error

工作表相关操作

增、删、改、查

创建工作表:NewSheet(SheetName) (int, error)

新建工作表默认在末尾,返回新创建的工作表索引

删除工作表:DeleteSheet(sheet string) error

当仅包含一个工作表时,此方法无效
当删除的表被其他表引用时会引发错误

设置工作表名称:SetSheetName(source, target string) error

移动工作表:MoveSheet(source, target string) error

移动工作表source到目标target之前

获取工作表名称:GetSheetName(index int) string,工作表不存在将返回空字符

获取工作表索引:GetSheetIndex(sheet string) (int, error) 工作表不存在返回-1

获取所有工作表:GetSheetMap() map[int]string

获取所有工作表:GetSheetList() []string

加密

加密工作表:ProtectSheet(sheet string, opts *SheetProtectionOptions) error

AlgorithmName:string,加密的哈希算法,支持XOR(默认)、MD4、MD5、SHA-1、SHA-256、SHA-384、SHA-512
Password:string,加密密码

其余选项为权限控制,全部为boll类型:
SelectLockedCells、SelectUnlockedCells
FormatCells、FormatColumns、FormatRows
InsertColumns、InsertRows、InsertHyperlinks
DeleteColumns、DeleteRows
Sort、AutoFilter、PivotTables
EditObjects、EditScenarios

取消加密工作表:UnprotectSheet(sheet string, password ...string) error

属性设置

设置默认工作表:SetActiveSheet(index int)

获取默认工作表:GetActiveSheetIndex() int,未找到默认工作表返回0

设置工作表背景:SetSheetBackground(SheetName, img_file)

设置平铺效果的背景图片
支持的图片格式有:BMP、EMF、EMZ、GIF、JPEG、JPG、PNG、SVG、TIF、TIFF、WMF 和 WMZ
在之前的版本中需要引入图片引擎
import (
    _ "image/gif"
    _ "image/jpeg"
    _ "image/png"
)

设置工作表可见性:SetSheetVisible(sheet string, visible bool, veryHidden ...bool) error

获取工作表可见性::GetSheetVisible(sheet string) (bool, error)

一个工作簿中至少要有一个可见的工作表
默认工作表设置不可见不生效
veryHidden仅在visible为false时生效

设置工作表属性:SetSheetProps(sheet string, opts *SheetPropsOptions) error

获取工作表属性:GetSheetProps(sheet string) (SheetPropsOptions, error)

常用配置项
EnableFormatConditionsCalculation:bool,条件格式是否自动计算,默认true
AutoPageBreaks:bool,是否自动分页,默认true
FitToPage:bool,是否开启自适应页面打印,默认值为 false
OutlineSummaryBelow:bool,分级显示是否在明细数据下方,默认true
OutlineSummaryRight:bool,分级显示是否在明细数据右侧,默认true
BaseColWidth:uint8,以字符数为单位表示的基本列宽度,默认8
DefaultColWidth:float64,默认列宽,包含边距和网格线
DefaultRowHeight:float64,默认行高
CustomHeight:bool,是否应用自定义行高,默认false
ZeroHeight:bool,是否隐藏空白行,默认false

设置页边距:SetPageMargins(sheet string, opts *PageLayoutMarginsOptions) error

获取页边距:GetPageMargins(sheet string) (PageLayoutMarginsOptions, error)

Top、Bottom、Left、Right:float64,上下左右页边距
Header、Footer:float64,页眉页脚
Horizontally:bool,页面是否水平居中
Vertically:bool,页面是否垂直居中

视图相关

设置工作表视图属性:SetSheetView(sheet string, viewIndex int, opts *ViewOptions) error

获取工作表视图属性:GetSheetView(sheet string, viewIndex int) (ViewOptions, error)

RightToLeft:bool,是否使用从右到左显示模式,默认false
ShowFormulas:bool,是否显示公式,默认false
ShowGridLines:bool,是否显示网格线,默认true
ShowRowColHeaders:bool,是否显示标题行和标题列,默认true
ShowZeros:bool,是否显示单元格的零值,默认true,否则显示空白
TopLeftCell:string,左上角可见单元格的坐标
View:string,工作表视图类型,枚举值为normal,pageBreakPreview 和 pageLayout
ZoomScale:float64,缩放比例,区间范围限于10 ~ 400,默认100

拆分冻结窗口:SetPanes(sheet string, panes *Panes) error

Freeze:bool,是否冻结单元格
Split :bool,是否拆分单元格
XSplit :int,水平分割的列索引
YSplit :int,垂直分割的行索引
TopLeftCell:string,右下方区域中左上角单元格坐标

Freeze和Split不能同时为true
当Freeze为true时,XSplit和YSplit的单位为列或行
当Split为true时,XSplit和YSplit的单位为1/20像素

列分级显示:SetColOutlineLevel(sheet, col string, level uint8) error

获取列的分级级别:GetColOutlineLevel(sheet, col string) (uint8, error)

行分级显示:SetRowOutlineLevel(sheet string, row int, level uint8) error

获取行的分级级别:GetRowOutlineLevel(sheet string, row int) (uint8, error)

行列操作

设置列的可见性:SetColVisible(sheet, col string, visible bool) error

获取列的可见性:GetColVisible(sheet, column string) (bool, error)

file.SetColVisible("Sheet1", "D", false)    隐藏D列
file.SetColVisible("Sheet1", "D:F", false)  隐藏D至F列

设置行的可见性:SetRowVisible(sheet string, row int, visible bool) error

获取行的可见性:GetRowVisible(sheet string, row int) (bool, error)

设置列宽 SetColWidth(sheet, startCol, endCol string, width float64) error

获取列宽 GetColWidth(sheet, col string) (float64, error)

设置行高:SetRowHeight(sheet string, row int, height float64) error

获取行高 GetRowHeight(sheet string, row int) (float64, error)

插入列:InsertCols(sheet, col string, n int) error,在col列前插入n列空白列

插入行:InsertRows(sheet string, row, n int) error,在第row行前插入n行空白行

追加复制行:DuplicateRow(sheet string, row int) error,复制第row行数据到该行下一行

复制行:DuplicateRowTo(sheet string, row, row_to int) error

删除列:RemoveCol(sheet, col string) error

删除行:RemoveRow(sheet string, row int) error

按列获取所有值:GetCols(sheet string) ([][]string, error)

返回列表中每列为一个元素,每个元素为该列中所有值转化为string后组成的列表
如果可以将单元格格式应用于值,将获取格式后的值,否则将获取原始值

列迭代器:Cols(SheetName) (*Cols, error)

(cols *Cols) Next()
    将指针向下移动并返回bool值,下一列有值则返回true
(cols *Cols) Rows() ([]string, error)
    返回当前指针位置的所有行的值组成的数组

cols, _ := file.Cols("Sheet1")
for cols.Next(){
    col, _ := cols.Rows()
    fmt.Println(col) //当前列所有值组成的数组
}

按行获取所有值:GetRows(sheet string) ([][]string, error)

返回列表中每行为一个元素,每个元素为该行中所有值转化为string后组成的列表
如果可以将单元格格式应用于值,将获取格式后的值,否则将获取原始值
每行获取带有值的单元格,行尾连续为空的单元格将被跳过,返回每行中的单元格数目可能不同

行迭代器:Rows(SheetName) (*Rows, error)

(rows *Rows) Next()
    将指针向下移动并返回bool值,下一行有值则返回true
(rows *Rows) Columns() ([]string, error)
    返回当前指针位置的所有列的值组成的数组

其他操作

复制工作表:CopySheet(from, to int)

将索引为form的工作表内容复制到to工作表中
两个工作表必须都已经存
只支持复制单元格值和公式,不支持表格、图片、图表和透视表等

在工作表中搜索:SearchSheet(sheet, value string, reg ...bool) ([]string, error)

    reg默认false,表示使用文本匹配,为true时value被解析为正则表达式
    仅支持字符串和数字的完全匹配,不支持公式计算后的结果、格式化数字和条件搜索
    
    result, err := f.SearchSheet("Sheet1", "100")
    result, err := f.SearchSheet("Sheet1", "[0-9]", true)

按列赋值:SetSheetCol(sheet, cell string, slice interface{}) error

从单元格cell开始按列以此将slice中的值填入单元格

err := f.SetSheetCol("Sheet1", "B6", &[]interface{}{"1", nil, 2})

按行赋值:SetSheetRow(sheet, cell string, slice interface{}) error

err := f.SetSheetRow("Sheet1", "B6", &[]interface{}{"1", nil, 2})

单元格操作

值相关

设置值

SetCellValue(sheet, cell string, value interface{}) error
SetCellBool(sheet, cell string, value bool) error
SetCellInt(sheet, cell string, value int) error
SetCellUint(sheet, cell string, value uint64) error
SetCellFloat(sheet, cell string, value float64, precision, bitSize int) error
    precision表示小数位数
    bitSize表示保存的浮点数类型,可选值为32或64
SetCellStr(sheet, cell, value string) error

获取值:GetCellValue(sheet, cell string) (string, error)

如果可以将单元格格式应用于值,将获取格式后的值,否则将获取原始值
最后将获取到的值转换为string返回

获取单元格数据类型:GetCellType(sheet, cell string) (CellType, error)

公式相关

设置公式:SetCellFormula(sheet, cell, formula string, opts ...FormulaOpts) error

获取公式:GetCellFormula(sheet, cell string) (string, error)

计算单元格的值:CalcCellValue(sheet, cell string, opts ...Options) (string, error)

合并单元格

合并单元格:MergeCell(SheetName, start_Cell, end_Cell) error

如果合并区域与已有其他合并单元格,已有的合并单元格会被删除

获取所有合并单元格:GetMergeCells(sheet string) ([]MergeCell, error)

(m *MergeCell) GetCellValue() string   返回合并单元格的值
(m *MergeCell) GetStartAxis() string   返回合并单元格左上角单元格坐标
(m *MergeCell) GetEndAxis() string     返回合并单元格右下角单元格坐标

取消合并单元格:UnmergeCell(sheet, start_Cell, end_Cell string) error

超链接

设置超链接:SetCellHyperLink(sheet, cell, link, linkType string, opts ...HyperlinkOpts) error

linkType可选值External(外部链接)和Location(内部链接)
excelize.HyperlinkOpts主要用于设置鼠标放上去的显示内容

show := "单元格显示文本"
tip  := "鼠标放置显示文本"
file.SetCellHyperLink("Sheet1", "A4","测试!A1","Location",
    excelize.HyperlinkOpts{
    Display: &show,
    Tooltip: &tip,
})
实测当前Display配置项不起效

获取超链接:GetCellHyperLink(sheet, cell string) (bool, string, error)

如果设置了超链接,返回true和链接地址,否则返回false和空的链接地址

单元格样式

创建样式:NewStyle(style *Style) (int, error)

在EXCEL中根据具体的样式创建样式并返回该样式的ID

关于excelize.Style的创建点击查看

设置单元格样式:

SetCellStyle(sheet, start_Cell, end_Cell string, styleID int) error
    设置两个单元格的区域中单元格样式
SetColStyle(sheet, columns string, styleID int) error
    设置列单元格样式
    可以设置多列,如"B:F"表示设置B列到F列
SetRowStyle(sheet string, start, end, styleID int) error
    设置行单元格样式

获取样式索引:

获取单元格样式索引:GetCellStyle(sheet, cell string) (int, error)
获取列样式索引 :GetColStyle(sheet, col string) (int, error)

根据样式索引获取样式: GetStyle(idx int) (*Style, error)

图片操作

插入图片:AddPicture(sheet, cell, picture string, opts *GraphicOptions) error

需要先引入图片引擎才能使用指定格式的图片
import (
    _ "image/gif"
    _ "image/jpeg"
    _ "image/png"
)
opts为图片的格式设置选项
AltText             string,指定图形对象的可选文字
PrintObject         *bool,打印时是否打印图片,默认true
Locked              *bool,当工作表受保护时是否锁定图片
LockAspectRatio     bool,是否锁定图片的纵横比,默认false
AutoFit             bool,是否使尺寸自动适合单元格,默认false
AutoFitIgnoreAspect bool,是否强制禁止尺寸自动适合单元格,默认false
OffsetX             int,图片与插入单元格的水平偏移量,默认0
OffsetY             int,图片与插入单元格的垂直偏移量,默认0
ScaleX              float64,水平缩放比例,默认为1.0,表示100%
ScaleY              float64,垂直缩放比例,默认为1.0,表示100%
Hyperlink           string,指定超链接
HyperlinkType       string,指定超链接类型,可选值External和Location
Positioning         string,指定图片的位置属性,有3个可选值
                    oneCell :大小固定,位置随单元格改变
                    twoCell :大小和位置都随单元格改变(默认值)
                    absolute:大小、位置均固定

获取图片:GetPictures(sheet, cell string) ([]Picture, error)

type Picture struct {
    Extension  string
    File       []byte
    Format     *GraphicOptions
}

Extension  :图片名称
File       :图片数据
Format     :图片的格式属性

删除图片:err := file.DeletePicture(SheetName,axis)

获取所有含图片的单元格:GetPictureCells(sheet string) ([]string, error)

批注相关

设置批注:AddComment(sheet string, comment Comment) error

type Comment struct {
    Author    string
    Cell      string
    Text      string
    Width     uint
    Height    uint
    Paragraph []RichTextRun
}

Paragraph用于设置不同的字体样式
切片中的所有Text内容会连接起来追加到Comment.Text中
type RichTextRun struct {
    Font *Font
    Text string
}

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

获取所有批注:GetComments(sheet string) ([]Comment, error)

删除批注:DeleteComment(sheet, cell string) error



网址导航