Skip to content

Excel增强支持

刘元涛 edited this page Oct 14, 2022 · 4 revisions

excelize/v2的增版扩展版本(不做修改,制作扩展),支持读取excel并转换为struct;核心部分没有使用任何第三方包,引入第三方包都是测试和转换使用的

同时此工具也支持二维数组转结构体切片

使用方式

项目中执行引入包

go get -u github.com/lytdev/go-mykit/gme

结构体TAG 中,为了语义明确建议写明gme如果不写的话是适用属性充当默认值

gme->index: 索序号(从0开始),如果不写默认和结构体的字段顺序一致(从0开始)

gme->title: 名称,如果不写则使用结构体的字段属性名

Excel 对应的结构体参考:

type ExcelBook struct {
 Isbn      string  `gme:"title:ISBN;index:0"`
 BookName  string  `gme:"title:书名;index:1"`
 Author    string  `gme:"title:作者;index:2"`
 PubDate   string  `gme:"title:出版日期;index:3"`
 Price     float32 `gme:"title:定价;index:4"`
 SuitObj   string  `gme:"title:适用对象;index:5"`
 MajorType string  `gme:"title:图书类目;index:6"`
 SubMajor  string  `gme:"title:细分类目;index:7"`
}

Excel 读取出来的数据格式:

var bookList = [][]string{
  {"9787115375698", "Excel 2013在会计与财务管理日常工作中的应用", "神龙工作室 编著", "2021-12-01", "49.8", "本科", "计算机类", "办公软件"},
  {"9787115500786", "Excel 2016高效办公 财务管理", "Excel Home", "2021-02-01", "79", "本科", "计算机类", "办公软件"},
  {"9787115497048", "信息图表其实很简单", "[美] 贾斯汀·毕杰尔(Justin Beegel)", "2018-12-01", "79", "本科", "计算机类", "办公软件"},
 }

如果要执行案例测试,先引入excel依赖

go get github.com/xuri/excelize/v2

使用文档:https://github.com/lytdev/go-myexcel/wiki

目前在excel支持的日期格式:https://github.com/lytdev/go-myexcel/blob/main/gformt/dateformat_test.go

接口说明

  • NewExcelStructDefault:实例化转换对象

  • SetPointerStruct:设置结构体指针

  • RowsAllProcessRowsProcess:处理二维数组数据,即excel读取出来的数据

  • Row:处理一维数组数据,即excel的一行数据

案例

excel读取转结构体列表

package main

import (
 "fmt"
 "os"
 "testing"
 gme "github.com/lytdev/go-myexcel"
 "github.com/lytdev/go-myexcel/mapstructure"

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

type ExcelTest struct {
 Isbn      string  `gme:"title:ISBN;index:0"`
 BookName  string  `gme:"title:书名;index:1"`
 Author    string  `gme:"title:作者;index:2"`
 PubDate   string  `gme:"title:出版日期;index:3"`
 Price     float32 `gme:"title:定价;index:4"`
 SuitObj   string  `gme:"title:适用对象;index:5"`
 MajorType string  `gme:"title:图书类目;index:6"`
 SubMajor  string  `gme:"title:细分类目;index:7"`
}

func main() {
 filePath := "D:\\测试数据\\图书列表.xlsx"
 xlsx, err := excelize.OpenFile(filePath)
 if err != nil {
  t.Error("文件读取异常:", err)
  os.Exit(1)
 }
 // Get all the rows in a sheet.
 sheetName := xlsx.GetSheetName(0)
 rows, err := xlsx.GetRows(sheetName)
 if err != nil {
  fmt.Println(err)
  t.Error("获取行数据异常:", err)
  os.Exit(1)
 }
 var resultData []ExcelTest
 err = gme.NewExcelStructDefault().SetPointerStruct(&ExcelTest{}).RowsAllProcess(rows, func(maps map[string]interface{}) error {
  var ptr ExcelTest
  // map 转 结构体
  if mapErr := mapstructure.Decode(maps, &ptr); mapErr != nil {
   return mapErr
  }
  resultData = append(resultData, ptr)
  return nil
 })
 if err != nil {
  t.Error("转换出现错误:", err)
  os.Exit(1)
 }
 for _, data := range resultData {
  fmt.Println(data)
  t.Log(data)
 }
}

转换一行数据

//单行处理
var demo = []string{"9787115375698", "Excel 2013在会计与财务管理日常工作中的应用", "神龙工作室 编著", "2021-12-01", "49.8", "本科", "计算机类", "办公软件"}
row, err := gme.NewExcelStructDefault().SetPointerStruct(&ExcelBook{}).Row(demo)
if err != nil {
    fmt.Println(err)
    os.Exit(1)
}
fmt.Println(row)
var demoStruct ExcelBook
// map 转 结构体
if err2 := mapstructure.Decode(row, &demoStruct); err2 != nil {
    fmt.Println(err2)
}
fmt.Println(demoStruct)
Clone this wiki locally