Go语言中的EXCEL表格操作
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