golang利用反射写入excel的简单工具类
golang利用反射写入excel的简单工具类
- 工具类源码
- 使用方法
工具类源码
package excelimport ("errors""github.com/tealeg/xlsx""os""reflect""strings""zonst/qipai/api/searchscript/infoqueryscript/log"
)func WriteExcel(filePath string, objs interface{}) error {kind := reflect.TypeOf(objs).Kind()if kind != reflect.Slice && kind != reflect.Array {return errors.New("need slice or array")}file := xlsx.NewFile()sheet, err := file.AddSheet("sheet")if err != nil {log.Errorf(err.Error())return err}values := reflect.ValueOf(objs)for i := 0; i < values.Len(); i++ {value := values.Index(i)if value.Kind() == reflect.Ptr {value = value.Elem()}row := sheet.AddRow()if i == 0 {//新增表头valType := value.Type()for j := 0; j < value.NumField(); j++ {row.AddCell().SetValue(valType.Field(j).Tag.Get("excel"))}row = row.Sheet.AddRow()addRowBodyValue(value, row)continue}addRowBodyValue(value, row)}return saveExcel(filePath, file)
}func addRowBodyValue(value reflect.Value, row *xlsx.Row) {for v := 0; v < value.NumField(); v++ {field := value.Field(v)val := objToInterface(field)row.AddCell().SetValue(val)}
}func objToInterface(field reflect.Value) interface{} {switch field.Type().Kind() {case reflect.Int:return field.Int()case reflect.Int32:return field.Int()case reflect.Int64:return field.Int()case reflect.Float32:return field.Float()case reflect.Float64:return field.Float()case reflect.Bool:return field.Bool()case reflect.String:return field.String()default:return field.String()}
}func saveExcel(filePath string, file *xlsx.File) error {//取出文件夹目录if strings.Contains(filePath, "/") {index := strings.LastIndex(filePath, "/")dir := filePath[0:index]err := os.MkdirAll(dir, os.ModePerm)if err != nil {log.Errorf("MkdirAll失败 err:%v", err)return err}}err := file.Save(filePath)if err != nil {log.Errorf("保存excel失败 err:%v", err)return err}return nil
}
使用方法
package mainimport "zonst/qipai/api/searchscript/infoqueryscript/excel"type People struct {Name string `excel:"姓名"`Age int `excel:"年龄"`
}func main() {arr := []People{{Name: "张三",Age: 18,},{Name: "李四",Age: 20,},}err := excel.WriteExcel("/Users/zonst/Downloads/用户信息.xlsx", arr)if err != nil {panic(err)}
}
效果图: