代码拉取完成,页面将自动刷新
package excel
import (
"bytes"
"errors"
"io"
"reflect"
"strconv"
"strings"
excelize "github.com/xuri/excelize/v2"
)
type Excel struct {
Filename string
reader io.Reader
offset int
}
func NewExcelFromReader(r io.Reader) *Excel {
return &Excel{reader: r}
}
func (e *Excel) Offset(n int) *Excel {
e.offset = n
return e
}
func getFieldName(field reflect.StructField) string {
tag := strings.TrimSpace(field.Tag.Get("xlsx"))
if tag != "" {
return tag
}
return field.Name
}
func getFieldWidth(field reflect.StructField) float64 {
w := strings.TrimSpace(field.Tag.Get("colWidth"))
if len(w) == 0 {
return 8.44
}
wf, err := strconv.ParseFloat(w, 64)
if err != nil {
return 8.44
}
return wf
}
func (e Excel) excelizeOpen() (*excelize.File, error) {
if e.Filename != "" {
return excelize.OpenFile(e.Filename)
} else if e.reader != nil {
return excelize.OpenReader(e.reader)
}
return nil, errors.New("filename can not be empty")
}
func (e Excel) Scan(v interface{}) error {
rv := reflect.ValueOf(v)
if rv.Kind() != reflect.Ptr {
return errors.New("param type must be ptr")
}
rv = rv.Elem()
if rv.Kind() != reflect.Struct {
return errors.New("param type must be struct ptr")
}
rt := rv.Type()
f, err := e.excelizeOpen()
if err != nil {
return err
}
for i := 0; i < rt.NumField(); i++ {
Sheet{Sheet: getFieldName(rt.Field(i))}.Offset(e.offset).scanSheet(f, rv.Field(i).Addr())
}
return nil
}
func (e Excel) Export(v interface{}) (*bytes.Buffer, error) {
rv := reflect.ValueOf(v)
if rv.Kind() != reflect.Ptr {
return nil, errors.New("param type must be ptr")
}
rv = rv.Elem()
if rv.Kind() != reflect.Struct {
return nil, errors.New("param type must be struct ptr")
}
rt := rv.Type()
f := excelize.NewFile()
deleteDefaultSheet := true
for i := 0; i < rt.NumField(); i++ {
sheet := &Sheet{Sheet: getFieldName(rt.Field(i))}
if err := sheet.sheetExport(f, rv.Field(i).Addr()); err != nil {
return nil, err
}
if sheet.Sheet == defaultSheet {
deleteDefaultSheet = false
}
}
if deleteDefaultSheet {
f.DeleteSheet(defaultSheet)
}
return f.WriteToBuffer()
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。