当前位置: 首页 > 工具软件 > Excelize > 使用案例 >

Golang操作Excel的模块Excelize学习总结2-设置单元格数据

魏兴邦
2023-12-01

Golang操作Excel的模块Excelize – 设置单元格的值

  • 新建excel文件
    excelize.NewFile()

  • 获取当前活动的sheet页索引
    func (f *File) GetActiveSheetIndex() (index int)

  • 指定单元格设置值
    func (f *File) SetCellValue(sheet, axis string, value interface{}) error

  • 指定单元格设置值,常规不转码
    func (f *File) SetCellDefault(sheet, axis, value string) error

  • 设置单元格的值 字符串
    func (f *File) SetCellStr(sheet, axis, value string) error

  • 设置单元格的值 布尔
    func (f *File) SetCellBool(sheet, axis string, value bool) error

  • 设置单元格的值 浮点型

    第三个参数是值,必须是float64类型的,第四个是小数点的位数,第五个是32或者64,原始的数据是float32就是32,是float64就是64

    func (f *File) SetCellFloat(sheet, axis string, value float64, prec, bitSize int) error

  • 设置单元格的值 整数
    func (f *File) SetCellInt(sheet, axis string, value int) error

  • 设置单元格的值 公式
    func (f *File) SetCellFormula(sheet, axis, formula string, opts ...FormulaOpts) error

  • 设置链接 linkType -> Location 本地文件 -> External 外部链接,跳转页面

    只是设置链接,不会设置显示的值,也不会设置样式

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

  • 插入行 插入列 插入的那一行/列的索引就是当前传的参数 传入的就是当前行的索引,从1/A开始的
    func (f *File) InsertRow(sheet string, row int) error
    func (f *File) InsertCol(sheet, col string) error

  • 追加复制的行,就是把当前行在下方在插入
    func (f *File) DuplicateRow(sheet string, row int) error

  • 复制指定行到指定行 把row行复制到row2行
    func (f *File) DuplicateRowTo(sheet string, row, row2 int) error

  • 删除行/列
    func (f *File) RemoveRow(sheet string, row int) error
    func (f *File) RemoveCol(sheet, col string) error

  • 在指定sheet页查询满足正则的单元格

    搜索到的单元格是满足字符匹配的 也就是说,满足unicode编码的单元格
    func (f *File) SearchSheet(sheet, value string, reg ...bool) ([]string, error)

  • 设置工作表(sheet页)的名称
    func (f *File) SetSheetName(oldName, newName string)

  • 通过切片生成整行的数据 第三个参数是切片的指针
    func (f *File) SetSheetRow(sheet, axis string, slice interface{}) error

  • 行列索引与单元格坐标的转换
    func excelize.JoinCellName(col string, row int) (string, error)行列索引转单元格坐标
    func excelize.SplitCellName(cell string) (string, int, error) 单元格转列行索引

  • 合并单元格
    func (*excelize.File).MergeCell(sheet string, hcell string, vcell string) error 后面两个参数是起始单元格坐标和结束单元格的坐标

    获取到的合并单元格的所有基础单元格的值都是一样的,不知道是不是excel版本的问题,待确认

代码:main.go

package main

import (
	"fmt"

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

func main() {
	f := excelize.NewFile()
	f.Path = "../excel_files/TMP_02.xlsx"

	// 获取当前活动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就是64
	f.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格式的数据写入excel
	var 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)
	// 保存
	f.Save()
	// f.SaveAs("../excel_files/TMP_02.xlsx")
}

更多API请移驾作者大佬的文档 : https://xuri.me/excelize/zh-hans/
作者大佬的视频 : https://www.bilibili.com/video/BV1hU4y1F7wQ

 类似资料: