-
Notifications
You must be signed in to change notification settings - Fork 2
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
:设置结构体指针 -
RowsAllProcess
和RowsProcess
:处理二维数组数据,即excel
读取出来的数据 -
Row
:处理一维数组数据,即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)
copyright © 2022 liuyuantao all rights reserved.