golang读取xls并转为结构体
2024-01-29 本文已影响0人
夜空最亮的9星
excel文件内容如下:
序号 车牌号 所属公司 车辆类型 车辆自重 (kg)
1 沪AF9776 上海XX运输有限公司 重型货车 13000
2 沪FC1739 上海XX运输有限公司 重型货车 13000
3 沪FZ3757 上海XX运输有限公司 重型货车 13000
4 沪XZ5782 上海XX运输有限公司 重卸货车 13000
定义结构体:
import (
"fmt"
"reflect"
"strconv"
"strings"
"github.com/extrame/xls"
)
/**
定义prefix标签,作为匹配excel表头信息的前缀
*/
type ExcelItem struct {
Id int `json:"id" prefix:"序号"`
PlateNumber string `json:"plateNumber" prefix:"车牌号"`
Company string `json:"company" prefix:"所属公司"`
CarType string `json:"carType" prefix:"车辆类型"`
CarbWeight int `json:"weight" prefix:"车辆自重"`
}
func ReadExcel(file_path string) (result [][]string) {
if xlFile, err := xls.Open(file_path, "utf-8"); err == nil {
//第一个sheet
sheet := xlFile.GetSheet(0)
if sheet.MaxRow != 0 {
temp := make([][]string, sheet.MaxRow)
for i := 0; i < int(sheet.MaxRow); i++ {
row := sheet.Row(i)
data := make([]string, 0)
if row.LastCol() > 0 {
for j := 0; j < row.LastCol(); j++ {
col := row.Col(j)
data = append(data, col)
}
temp[i] = data
}
}
result = append(result, temp...)
}
}
return result
}
func ConverToStruct(data [][]string) (list []ExcelItem) {
getType := reflect.TypeOf(ExcelItem{})
tagFieldMap := make(map[string]string)
for i := 0; i < getType.NumField(); i++ {
field := getType.Field(i)
tag := field.Tag.Get("prefix")
if tag != "" {
tagFieldMap[tag] = field.Name
}
}
for i := 1; i < len(data); i++ {
if len(data[i]) < getType.NumField() {
continue
}
item := ExcelItem{}
for j := 0; j < getType.NumField(); j++ {
tag := getType.Field(j).Tag.Get("prefix")
fieldName, ok := tagFieldMap[tag]
if !ok {
continue
}
/**
如果表头字段和定义的prefix前缀不匹配,则忽略
*/
if !strings.HasPrefix(data[0][j], tag) {
fmt.Printf("请注意存在未匹配字段:%s", data[0][j])
continue
}
fieldValue := reflect.ValueOf(&item).Elem().FieldByName(fieldName)
if !fieldValue.IsValid() {
continue
}
switch fieldValue.Kind() {
case reflect.Int:
intValue, err := strconv.Atoi(data[i][j])
if err != nil {
fmt.Printf("Failed to parse %s: %s\n", tag, err)
continue
}
fieldValue.SetInt(int64(intValue))
case reflect.String:
fieldValue.SetString(data[i][j])
}
}
list = append(list, item)
}
return list
}
func ConverXlsFileToStruct(file_path string) (item []ExcelItem) {
s := ReadExcel(file_path)
return ConverToStruct(s)
}
使用
file_path := "./004.xls"
fmt.Println(file_path)
list := ConverXlsFileToStruct(file_path)
// 输出结构体切片
for _, car := range list {
fmt.Printf("Serial Number: %d, License Plate: %s, Company: %s, Car Type: %s, Car Weight: %d\n",
car.Id, car.PlateNumber, car.Company, car.CarType, car.CarbWeight)
}