代码拉取完成,页面将自动刷新
package util
import (
"encoding/json"
"fmt"
"reflect"
"strconv"
"github.com/tealeg/xlsx"
)
func DeserializeStructFromExcelRow(e interface{}, row *xlsx.Row) (err error) {
v := reflect.ValueOf(e)
ve := v.Elem()
if ve.Kind() != reflect.Struct {
return fmt.Errorf("[%#v] is not a struct", e)
}
t := reflect.TypeOf(e)
te := t.Elem()
for i := 0; i < ve.NumField(); i++ {
column := i + 1
tf := te.Field(i)
tagColumn := tf.Tag.Get("excel_column")
if tagColumn != "" {
if column, err = strconv.Atoi(tagColumn); err != nil {
return fmt.Errorf("get %s column fail, %s", tf.Name, err)
}
}
if column >= len(row.Cells) {
continue
}
cell := row.Cells[column]
if cell.Value == "" {
continue
}
vef := ve.Field(i)
kind := vef.Kind()
switch kind {
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
i64, err := cell.Int64()
if err != nil {
return fmt.Errorf("could not set %s %s to %s, %s", kind.String(), tf.Name, cell.Value, err)
}
vef.SetInt(i64)
case reflect.String:
vef.SetString(cell.String())
case reflect.Float32, reflect.Float64:
f64, err := cell.Float()
if err != nil {
return fmt.Errorf("could not set %s %s to %s, %s", kind.String(), tf.Name, cell.Value, err)
}
vef.SetFloat(f64)
case reflect.Slice, reflect.Struct, reflect.Array:
if err := json.Unmarshal([]byte(cell.String()), vef.Addr().Interface()); err != nil {
return fmt.Errorf("could not set %s %s to %s, %s", kind.String(), tf.Name, cell.Value, err)
}
default:
if err := json.Unmarshal([]byte(cell.String()), vef.Interface()); err != nil {
return fmt.Errorf("could not set %s %s to %s, %s", kind.String(), tf.Name, cell.Value, err)
}
}
}
return nil
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。