最佳体验请使用Chrome67及以上版本、火狐、Edge、Safari浏览器 ×

创建银行
创建开票

    Go结合反射将结构体转换成Excel

    作者:黄能鹏@云商软件 阅读385 2022/08/30 11:16:25 文章 原创 公开


    定义结构体


    type Record struct {

        Name string `xlsx:"A-姓名"`

        Age  int32  `xlsx:"B-年齡"`

    }


    反射写


    func RefactorWrite(records []*Record) {

        xlsx := excelize.NewFile()

        index := xlsx.NewSheet("Sheet1")


        for i, t := range records {

            d := reflect.TypeOf(t).Elem()

            for j := 0; j < d.NumField(); j++ {

                // 设置表头

                if i == 0 {

                    column := strings.Split(d.Field(j).Tag.Get("xlsx"), "-")[0]

                    name := strings.Split(d.Field(j).Tag.Get("xlsx"), "-")[1]

                    xlsx.SetCellValue("Sheet1", fmt.Sprintf("%s%d", column, i+1), name)

                }

                // 设置内容

                column := strings.Split(d.Field(j).Tag.Get("xlsx"), "-")[0]

                switch d.Field(j).Type.String() {

                case "string":

                    xlsx.SetCellValue("Sheet1", fmt.Sprintf("%s%d", column, i+2), reflect.ValueOf(t).Elem().Field(j).String())

                case "int32":

                    xlsx.SetCellValue("Sheet1", fmt.Sprintf("%s%d", column, i+2), reflect.ValueOf(t).Elem().Field(j).Int())

                case "int64":

                    xlsx.SetCellValue("Sheet1", fmt.Sprintf("%s%d", column, i+2), reflect.ValueOf(t).Elem().Field(j).Int())

                case "bool":

                    xlsx.SetCellValue("Sheet1", fmt.Sprintf("%s%d", column, i+2), reflect.ValueOf(t).Elem().Field(j).Bool())

                case "float32":

                    xlsx.SetCellValue("Sheet1", fmt.Sprintf("%s%d", column, i+2), reflect.ValueOf(t).Elem().Field(j).Float())

                case "float64":

                    xlsx.SetCellValue("Sheet1", fmt.Sprintf("%s%d", column, i+2), reflect.ValueOf(t).Elem().Field(j).Float())

                }

            }

        }


        xlsx.SetActiveSheet(index)

        // 保存到xlsx中

        err := xlsx.SaveAs("test_write.xlsx")

        if err != nil {

            fmt.Println(err)

        }

    }


    Demo


    func main() {

        var records []*Record

        records = append(records, &Record{

           Name: "小明",

          Age:  11,

        })

        records = append(records, &Record{

           Name: "小华",

          Age:  12,

        })

        // 反射写

        RefactorWrite(records)

    }


    声明:本网站部分内容来源于网络,版权归原权利人所有,其观点不代表本网站立场;本网站视频或图片制作权归当前商户及其作者,涉及未经授权的制作均须标记“样稿”。如内容侵犯了您相关权利,请及时通过邮箱service@ichub.com与我们联系。
     0  0

    微信扫一扫:分享

    微信里点“+”,扫一扫二维码

    便可将本文分享至朋友圈。

      
    
    
    分享
     0
      验证