golang Excel数据绑定到Go结构体的插件库exl的使用

golang Excel数据绑定到Go结构体的插件库exl的使用

exl是一个将Excel数据绑定到Go结构体的库(仅支持Go1.18+版本)。

读取Excel

package main

import (
	"fmt"
	
	"github.com/go-the-way/exl"
)

// 定义结构体,使用excel标签指定Excel列名
type ReadExcel struct {
	ID   int    `excel:"ID"`
	Name string `excel:"Name"`
}

// 实现ReadConfigure方法用于配置读取选项
func (*ReadExcel) ReadConfigure(rc *exl.ReadConfig) {}

func main() {
	// 读取Excel文件并绑定到结构体切片
	if models, err := exl.ReadFile[*ReadExcel]("/to/path.xlsx"); err != nil {
		fmt.Println("read excel err:" + err.Error())
	} else {
		fmt.Printf("read excel num: %d\n", len(models))
	}
}

写入Excel

package main

import (
	"fmt"
	
	"github.com/go-the-way/exl"
)

// 定义结构体,使用excel标签指定Excel列名
type WriteExcel struct {
	ID   int    `excel:"ID"`
	Name string `excel:"Name"`
}

// 实现WriteConfigure方法用于配置写入选项
func (m *WriteExcel) WriteConfigure(wc *exl.WriteConfig) {}

func main() {
	// 将结构体切片写入Excel文件
	if err := exl.Write("/to/path.xlsx", []*WriteExcel{{100, "apple"}, {200, "pear"}}); err != nil {
		fmt.Println("write excel err:" + err.Error())
	} else {
		fmt.Println("write excel done")
	}
}

高级写入功能

package main

import (
	"fmt"

	"github.com/go-the-way/exl"
)

func main() {
	// 创建新的Writer
	w := exl.NewWriter()
	
	// 写入基本类型切片
	if err := w.Write("int", []int{1, 2}); err != nil {
		fmt.Println(err)
		return
	}
	
	// 写入浮点数切片
	if err := w.Write("float", []float64{1.1, 2.2}); err != nil {
		fmt.Println(err)
		return
	}
	
	// 写入字符串切片
	if err := w.Write("string", []string{"hello", "world"}); err != nil {
		fmt.Println(err)
		return
	}
	
	// 写入map切片
	if err := w.Write("map", []map[string]string{{"id":"1000","name":"hello"},{"id":"2000","name":"world"}}); err != nil {
		fmt.Println(err)
		return
	}
	
	// 写入匿名结构体切片
	if err := w.Write("structWithField", []struct{ID int}{{1000},{2000}}); err != nil {
		fmt.Println(err)
		return
	}
	
	// 写入带标签的结构体切片
	if err := w.Write("structWithTag", []struct{ID int `excel:"编号"`}{{1000},{2000}}); err != nil {
		fmt.Println(err)
		return
	}
	
	// 写入带标签和忽略字段的结构体切片
	if err := w.Write("structWithTagAndIgnore", []struct{
		ID int `excel:"编号"`
		Extra int `excel:"-"`
		Name string `excel:"名称"`
	}{{1000,0,"Coco"},{2000,0,"Apple"}}); err != nil {
		fmt.Println(err)
		return
	} 
	
	// 保存到文件
	if err := w.SaveTo("dist.xlsx"); err != nil {
		fmt.Println(err)
		return
	}
}

以上示例展示了如何使用exl库进行Excel文件的读取和写入操作,包括基本类型、map和结构体的处理,以及如何使用标签来控制Excel列的映射。


更多关于golang Excel数据绑定到Go结构体的插件库exl的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang Excel数据绑定到Go结构体的插件库exl的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用exl库实现Excel数据到Go结构体的绑定

exl是一个用于将Excel数据绑定到Go结构体的轻量级库,它可以帮助开发者快速地将Excel表格数据映射到Go的结构体中,简化数据处理流程。

安装exl库

首先需要安装exl库:

go get github.com/go-the-way/exl

基本使用方法

1. 定义结构体

首先定义一个与Excel表格对应的结构体,使用结构体标签来指定Excel列名:

type Student struct {
    ID      int     `excel:"学号"`
    Name    string  `excel:"姓名"`
    Age     int     `excel:"年龄"`
    Score   float64 `excel:"成绩"`
    Class   string  `excel:"班级"`
}

2. 读取Excel文件并绑定到结构体

package main

import (
    "fmt"
    "github.com/go-the-way/exl"
)

func main() {
    // 定义接收数据的切片
    var students []Student
    
    // 读取Excel文件
    err := exl.ReadToModel("students.xlsx", &students)
    if err != nil {
        panic(err)
    }
    
    // 打印读取的数据
    for _, student := range students {
        fmt.Printf("%+v\n", student)
    }
}

高级功能

1. 自定义Sheet名称

默认读取第一个Sheet,可以指定Sheet名称:

err := exl.ReadToModel("students.xlsx", &students, exl.WithSheetName("Sheet2"))

2. 从指定行开始读取

err := exl.ReadToModel("students.xlsx", &students, exl.WithStartRow(2)) // 从第2行开始

3. 自定义列映射

如果Excel列名与结构体字段名不一致,可以使用excel标签指定:

type Student struct {
    ID      int     `excel:"学号"`
    Name    string  `excel:"姓名"`
    // ...
}

4. 写入数据到Excel

exl也支持将结构体数据写入Excel文件:

err := exl.WriteFromModel("output.xlsx", students)

完整示例

package main

import (
    "fmt"
    "github.com/go-the-way/exl"
)

type Employee struct {
    ID        int     `excel:"员工ID"`
    Name      string  `excel:"姓名"`
    Department string `excel:"部门"`
    Salary    float64 `excel:"薪资"`
    JoinDate  string  `excel:"入职日期"`
}

func main() {
    // 读取Excel数据
    var employees []Employee
    err := exl.ReadToModel("employees.xlsx", &employees, exl.WithStartRow(2))
    if err != nil {
        panic(err)
    }
    
    // 处理数据
    for _, emp := range employees {
        fmt.Printf("员工: %s, 部门: %s, 薪资: %.2f\n", emp.Name, emp.Department, emp.Salary)
    }
    
    // 修改数据
    employees[0].Salary = employees[0].Salary * 1.1
    
    // 写入新文件
    err = exl.WriteFromModel("employees_updated.xlsx", employees)
    if err != nil {
        panic(err)
    }
    
    fmt.Println("数据处理完成并已保存到新文件")
}

注意事项

  1. Excel文件的第一行通常作为列标题行
  2. 结构体字段类型需要与Excel单元格数据类型匹配
  3. 对于日期类型,建议在Excel中使用字符串格式,然后在Go中进行转换
  4. 如果单元格为空,对应的结构体字段将是零值

exl库提供了一种简单直接的方式来处理Excel数据,特别适合需要快速将Excel数据导入到Go程序中进行处理的场景。对于更复杂的需求,可能需要考虑使用更强大的库如tealeg/xlsx或excelize。

回到顶部