golang 读取Excel 或者map字符型返回结构体数组

需求

使用github.com/360EntSecGroup-Skylar/excelize/v2 包,读取excel时没有返回结构体数组,非常不方便,目前网上没有直接转换的包

抽个时间,做了一个简单转换包

也支持 []string[][]string类型,返回结构体或结构体数组

风.foxwho

依赖

引入依赖

go get github.com/liangzibo/go-excel

结构体TAG中 json,index 必须存在

json: 字段名称

index: 索引名称

name: 中文名称

使用案例

案例地址 https://github.com/liangzibo/go-excel

测试结构体

type ExcelTest struct {
	Name     string    `json:"name" name:"名称" index:"0"`
	Age      int64     `json:"age" name:"年龄" index:"1"`
	Score    int64     `json:"score" name:"分数" index:"2"`
	Birthday time.Time `json:"birthday" name:"生日" index:"4"`
}

excel 读取 出的格式如下

var demoAll = [][]string{
		{"赵三",
			"30",
			"100",
			"1970-01-01 12:50:01",
			"1980-11-21 15:20:01"},
		{"赵六",
			"40",
			"30",
			"1970-01-01 12:50:01",
			"1980-11-21 15:20:01"},
	}

测试

	xlsx, err := excelize.OpenFile("./lzbExcel/excel.xlsx")
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    // Get all the rows in a sheet.
    rows, err := xlsx.GetRows("Sheet1")
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    //结果在  arr 中
    var arr []ExcelTest
    err = lzbExcel.NewExcelStructDefault().SetPointerStruct(&ExcelTest{}).RowsAllProcess(rows, func(maps map[string]interface{}) error {
        var ptr ExcelTest
		// map 转 结构体
        if err2 := mapstructure.Decode(maps, &ptr); err2 != nil {
            return err2
        }
        arr = append(arr, ptr)
        return nil
    })
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    fmt.Println(arr)
    
    //结果在  arr 中
    var arr2 []ExcelTest
    //StartRow 开始行,索引从 0开始
    //IndexMax  索引最大行,如果 结构体中的 index 大于配置的,那么使用结构体中的
    err = lzbExcel.NewExcelStruct(1, 10).SetPointerStruct(&ExcelTest{}).RowsAllProcess(rows, func(maps map[string]interface{}) error {
        var ptr ExcelTest
		// map 转 结构体
        if err2 := mapstructure.Decode(maps, &ptr); err2 != nil {
            return err2
        }
        arr2 = append(arr2, ptr)
        return nil
    })
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    fmt.Println(arr2)
    /
    
    
    var arr3 []ExcelTest
    excel := lzbExcel.NewExcelStruct(1, 10).SetPointerStruct(&ExcelTest{})
    for i, row := range rows {
        //If the index is less than the set start row, skip
        //如果 索引 小于 已设置的 开始行,那么跳过
        if i < excel.StartRow {
            continue
        }
        //单行处理
        m, err3 := excel.Row(row)
        if err3 != nil {
            fmt.Println(err3)
        }
        var tmp ExcelTest
        // map 转 结构体
        if err2 := mapstructure.Decode(m, &tmp); err2 != nil {
            fmt.Println(err2)
        } else {
            arr3 = append(arr3, tmp)
        }
    }
    fmt.Println("arr3")
    fmt.Println(arr3)
    //单行处理
    var demo = []string{
        "赵六",
        "40",
        "30",
        "1970-01-01 12:50:01",
        "1980-11-21 15:20:01",
    }
    row, err := lzbExcel.NewExcelStructDefault().SetPointerStruct(&ExcelTest{}).Row(demo)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    fmt.Println(row)
    var demoStruct ExcelTest
    // map 转 结构体
    if err2 := mapstructure.Decode(row, &demoStruct); err2 != nil {
        fmt.Println(err2)
    }
    fmt.Println(demoStruct)

结果

arr
[{张三 30 100 1999-02-01 15:20:31 +0800 CST} {李四 31 99 0001-01-01 00:00:00 +0000 UTC} {王五 33 0 0001-01-01 00:00:00 +0000 UTC}]
arr2
[{张三 30 100 1999-02-01 15:20:31 +0800 CST} {李四 31 99 0001-01-01 00:00:00 +0000 UTC} {王五 33 0 0001-01-01 00:00:00 +0000 UTC}]
arr3
[{张三 30 100 1999-02-01 15:20:31 +0800 CST} {李四 31 99 0001-01-01 00:00:00 +0000 UTC} {王五 33 0 0001-01-01 00:00:00 +0000 UTC}]
map[age:40 birthday:1980-11-21 15:20:01 +0800 CST name:赵六 score:30]
{赵六 40 30 1980-11-21 15:20:01 +0800 CST}

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页