Go 使用反射导出 Excel

定义结构体

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)
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!