美文网首页
golang读取xls并转为结构体

golang读取xls并转为结构体

作者: 夜空最亮的9星 | 来源:发表于2024-01-29 21:25 被阅读0次

    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)
        }
    

    相关文章

      网友评论

          本文标题:golang读取xls并转为结构体

          本文链接:https://www.haomeiwen.com/subject/tacnodtx.html