Excelize 是 Go 语言编写的一个用来操作 Office Excel 文档类库,基于 ECMA-376 Office OpenXML 标准。

可以使用它来读取、写入 XLSX 文件,相比较其他的开源类库,Excelize 支持写入原本带有图片(表)的文档,还支持向 Excel 中插入图片,并且在保存后不会丢失图表样式。

[注意事项]

使用最新版本 Excelize 要求您使用的 Go 语言为 1.15 或更高版本

一、依赖库

import ("fmt""reflect""github.com/xuri/excelize/v2"
)

核心库

"github.com/xuri/excelize/v2"

[excelize官方项目]

[excelize官方API]

二、读取和写入

(一)读取excel文件数据

函数

// 读取excel
func TestReadExcel() {// 打开文件f, err := excelize.OpenFile("Book1.xlsx")if err != nil {fmt.Println(err)return}// 捕获异常defer func() {if err := f.Close(); err != nil {fmt.Println(err)}}()// 获取工作表中指定单元格的值cell, err := f.GetCellValue("Sheet1", "A2")if err != nil {fmt.Println(err)return}fmt.Println("cell", cell)// 获取 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 TestGoExcelB(t *testing.T) {GoExcel.TestReadExcel()
}

效果

(二)覆盖写入

//  覆盖写入
func TestWriterEecel(sheetName string, cell string, writerContent string) {//  实例化结构体对象f,并调用结构体方法NewFile新建文件f := excelize.NewFile()// 创建一个工作表index := f.NewSheet("Sheet1")// 设置单元格的值f.SetCellValue("Sheet1", "A2", "Hello world.")f.SetCellValue("Sheet1", "B2", 100)// 设置工作簿的默认工作表f.SetActiveSheet(index)// 根据指定路径保存文件if err := f.SaveAs("Book1.xlsx"); err != nil {fmt.Println(err)}
}

(三)追加写入

封装

/*
* @methods TestAppendExcel
* @description 追加数据
* @params fileName string  文件名
* @params activeSheet string   Sheet名
* @params writerData map[string][]string{} 写入数据*/
func TestAppendExcel(fileName string, activeSheet string, writerData map[string][]string) {//  文件名// fileName := "Book1.xlsx"//  工作表// activeSheet := "Sheet1"//  打开文件f, _ := excelize.OpenFile(fileName)// Get all the rows in the Sheet1//  获取所有行的数据,按行获取rows, err := f.GetRows(activeSheet)// 行数据fmt.Printf("rows_content:%v\n", rows)//  行数fmt.Println("rows_len:", len(rows))//  捕获异常if err != nil {fmt.Println(err)return}//  获取所有列的内容 按列获取cols, err := f.GetCols(activeSheet)//  捕获异常if err != nil {fmt.Println(err)return}// 列数据fmt.Printf("cols_content:%v\n", cols)//  列数fmt.Println("cols_len:", len(cols))//  行高lineHeight, err := f.GetRowHeight(activeSheet, 1)fmt.Println("lineHeight:", lineHeight)//  捕获异常if err != nil {fmt.Println(err)return}//  行级别lineLevel, err := f.GetRowOutlineLevel(activeSheet, 2)fmt.Println("lineLevel:", lineLevel)//  捕获异常if err != nil {fmt.Println(err)return}// 遍历写入数据(遍历map元素是字符串数组)for i, arr_v := range writerData["names"] {fmt.Println("writerData['names']", arr_v)// 判断数据类型fmt.Println("writerData['names'] arr_v type:", reflect.TypeOf(arr_v))// 单元格值设置f.SetCellValue(activeSheet, fmt.Sprintf("A%d", len(rows)+1+i), fmt.Sprintf("%v", arr_v))}for i, arr_v := range writerData["address"] {fmt.Println("writerData['address']", arr_v)//  判断数据类型fmt.Println("writerData['address'] arr_v type:", reflect.TypeOf(arr_v))f.SetCellValue(activeSheet, fmt.Sprintf("B%d", len(rows)+1+i), fmt.Sprintf("%v", arr_v))}for i, arr_v := range writerData["numbers"] {fmt.Println("writerData['numbers']", arr_v)//  判断数据类型fmt.Println("writerData['numbers'] arr_v type:", reflect.TypeOf(arr_v))// 单元格值设置f.SetCellValue(activeSheet, fmt.Sprintf("C%d", len(rows)+1+i), fmt.Sprintf("%v", arr_v))fmt.Println("arr_v[i]:", arr_v)}//  单元格值设置// f.SetCellValue(activeSheet, fmt.Sprintf("A%d", len(rows)+1), fmt.Sprintf("aa%d", len(rows)+1))//  保存文件,并捕获异常if err := f.SaveAs(fileName); err != nil {fmt.Println(err)}
}

调用

func TestGoExcelC(t *testing.T) {// 声明集合map_data := map[string][]string{}// 声明数组并初始化names := []string{"张三", "李四", "王五"}fmt.Printf("names:%v\n", names)// 声明数组并初始化address := []string{"泉州市丰泽区", "厦门市集美区", "福州市金山区"}fmt.Printf("address:%v\n", address)// 声明数组并初始化numbers := []string{"2020001", "2020002", "2020003"}fmt.Printf("numbers:%v\n", numbers)map_data["names"] = namesmap_data["address"] = addressmap_data["numbers"] = numberst.Logf("map_data:%v\n", map_data) // map_data:map[address:[泉州市丰泽区 厦门市集美区 福州市金山区] names:[张三 李四 王五] numbers:[123123 234234 4534534]]// 追加写入excelGoExcel.TestAppendExcel("Book1.xlsx", "Sheet1", map_data)
}

效果 :

三 、常用方法

 // 获取当前活动sheet页的索引sheet_idx := f.GetActiveSheetIndex()sheetName := f.GetSheetName(sheet_idx)// 设置单元格的值// 在excel中SetCellValue设置的值都是常规模式f.SetCellValue(sheetName, "A1", "字符串")f.SetCellValue(sheetName, "A2", 200)f.SetCellValue(sheetName, "A3", true)f.SetCellStr(sheetName, "B1", "这是SetCellStr")f.SetCellBool(sheetName, "B3", true)f.SetCellFloat(sheetName, "B2", 100.00200, 3, 64) // 第三个参数是值,必须是float64类型的,第四个是小数点的位数,第五个是32或者64,原始的数据是float32就是32,是float64就是64f.SetCellInt(sheetName, "B4", 100000)             // 整数f.SetCellDefault(sheetName, "C1", "这是SetCellDefault")// 设置单个单元格的公式f.SetCellFormula(sheetName, "C2", "B2+A2")// 链接只会做链接,不会给单元格赋值,需要单独设置值和样式f.SetCellHyperLink(sheetName, "D1", "https://www.baidu.com", "External")f.SetCellValue(sheetName, "D1", "链接1External")f.SetCellHyperLink(sheetName, "D2", "Sheet1!A1", "Location")f.SetCellValue(sheetName, "D2", "链接2Location")// 插入行f.InsertRow(sheetName, 2)f.InsertCol(sheetName, "D")// 复制行f.DuplicateRow(sheetName, 3)f.DuplicateRowTo(sheetName, 1, 7)// 删除行/列f.RemoveCol(sheetName, "F")f.RemoveRow(sheetName, 7)//查找fmt.Println(f.SearchSheet(sheetName, "200", true))fmt.Println(f.SearchSheet(sheetName, "^[0-9]{1,3}$", true))// 修改sheet页的名称f.SetSheetName(sheetName, "新的名称")// go数据类型添加到excel中  其中的基础数据类型,string,int,float,bool 都可以直接通过设置指定单元格的值实现// 下面演示数组,切片以及map格式的数据写入excelvar arr = []interface{}{"姓名", "性别", "年龄", "工作",}idx := f.NewSheet("data")// 数据必须是 []interface{} 类型的err := f.SetSheetRow("data", "A1", &arr)if err != nil {fmt.Println(err)}f.SetActiveSheet(idx)// 行列索引转换为单元格索引fmt.Println(excelize.JoinCellName("A", 10))// 单元格索引拆分行、列索引fmt.Println(excelize.SplitCellName("AA10"))// 设置多个单元格的公式,相当于在excel中通过拖拉复制公式data := [][]float64{{10.5, 20.5}, {18, 28}, {100, 900}}for i, d := range data {startCell, _ := excelize.JoinCellName("A", i+2)f.SetSheetRow("data", startCell, &d)}// 定义需要设置公式的所有单元格范围f_type, ref := excelize.STCellFormulaTypeShared, "C2:C4"// 相当于设置计算公式的模板if err := f.SetCellFormula("data", "C2", "=SUM(A2:B2)", excelize.FormulaOpts{Type: &f_type, Ref: &ref}); err != nil {fmt.Println(err)}// 合并单元格if err := f.MergeCell("data", "D1", "G6"); err != nil {fmt.Println(err)}mergedCells, err := f.GetMergeCells("data")if err != nil {fmt.Println(err)}// 获取合并单元格的值以及合并单元格的起止位置for _, cell := range mergedCells {fmt.Println(cell.GetStartAxis())fmt.Println(cell.GetEndAxis())fmt.Println(cell.GetCellValue())}v, err := f.GetCellValue("data", "F3")if err != nil {fmt.Println(err)}fmt.Println("合并单元格中的数据值是:", v)

goland 读写excel相关推荐

  1. NPOI读写Excel

    1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet:行:Row:单元格Cell. 2.NPOI是POI的C#版本,NPOI的行和列的index都是从0开始 ...

  2. .NET读写Excel工具Spire.Xls使用(1)入门介绍

    原文:[原创].NET读写Excel工具Spire.Xls使用(1)入门介绍 在.NET平台,操作Excel文件是一个非常常用的需求,目前比较常规的方法有以下几种: 1.Office Com组件的方式 ...

  3. 数据分析从零开始实战,Pandas读写Excel/XML数据

    点击查看第一篇文章: 数据分析从零开始实战,Pandas读取HTML页面+数据处理解析_ 数据分析 从零开始到实战,Pandas读写CSV数据_ 数据分析 从零开始到实战,Pandas读写CSV数据 ...

  4. php如何读写excel

    php如何读写excel 一.总结 一句话总结:PHP操作Excel最好的方法是使用PHPExcel类, 可以到官网下载PHPExcel类库 http://phpexcel.codeplex.com ...

  5. python怎么读excelsheet_python3 excle(python怎么读写excel文件)

    python读取已经打开的3个word和excle文件的路径 用 win32com 操控 word和Excel就可以实现 咋样把python写入excle中 # 需安装 xlrd-0.9.2 和 xl ...

  6. python读写excel数据--pandas

    文章目录 1读写excel数据 1.1 读: 1.1 写: 2举例 2.1 要求 2.2 实现 1读写excel数据 利用pandas可以很方便的读写excel数据 1.1 读: data_in = ...

  7. 解决读写Excel的第三方类库as3xls无法读取中文和写入中文的问题

    原文 http://blog.csdn.net/pizzaman/article/details/5700954 最近做地图编辑器需要用As3读写Excel,找到了as3xls但存在诸多问题,1.无法 ...

  8. c# poi写入e_C# 使用 NPOI 库读写 Excel 文件(转载)

    NPOI 是开源的 POI 项目的.NET版,可以用来读写Excel,Word,PPT文件.在处理Excel文件上,NPOI 可以同时兼 容xls 和 xlsx.官网提供了一份Examples,给出了 ...

  9. python读取数据文件-python多种读写excel等数据文件的方式(收藏篇)

    前言: python处理数据文件的途径有很多种,可以操作的文件类型主要包括文本文件(csv.txt.json等).excel文件.数据库文件.api等其他数据文件.下面小编整理下python到底有哪些 ...

最新文章

  1. Python OpenCV分水岭算法分割和提取重叠或有衔接的图像中的对象
  2. 各浏览器中for in顺序的差异
  3. Bitcoin0.21版 公链开发(5) PHP集成到Apache中(windows平台)
  4. css div漂浮向下,DIV+CSS固定底部的漂浮广告
  5. Apache Flink新场景——OLAP引擎
  6. [VMM 2008虚拟化之初体验-1] 准备环境
  7. 【博客大赛】100行js代码实现网站在线用户数量统计 nodejs + socket.io方案
  8. 最大比例(压轴题 )
  9. java根据微信小程序code获取用户openId
  10. Win11如何给系统盘瘦身?Win11系统盘瘦身方法
  11. Python打印指定日期的日历
  12. 微信小程序 实现提示弹窗
  13. Data Analysis - Day7 - Pandas
  14. OSChina 周日乱弹 ——请世界不要对好人太薄情
  15. jupyter查看python包
  16. 解决mplfinance绘制箱体图一字涨停k线颜色错误的情况
  17. 机器学习笔记---从极大似然估计的角度看待Logistic回归
  18. EXCEL密码破解/破解工作表保护密码(详细图文教程)
  19. 恒大健康:自称股东的FF员工提起集体诉讼 无理控告我们
  20. chrome浏览器,谷歌浏览器卡顿解决方法

热门文章

  1. OA系统行业解析:中小企业实施OA系统的意义
  2. AD域控器限制U盘和存储设备
  3. 接口请求方式及GET和POST的区别
  4. 【暗黑者】暗黑者里darker是谁?揭秘下罗飞和darker的关系
  5. jenkins远程构建job_JENKINS触发远程构建功能使用
  6. 树莓派---设置WIFI自动连接或者取消自动连接
  7. matlab高级编程 苏金明,MATLAB高级编程
  8. 文件系统I/O缓冲-Linux
  9. mac移动硬盘安装linux系统安装教程,yong移动硬盘安装Linux的最新方法
  10. 通过IF({1,0}和VLOOKUP函数实现Excel的双条件多条件查找