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)
    }
上一篇下一篇

猜你喜欢

热点阅读