83 lines
2.3 KiB
Go
83 lines
2.3 KiB
Go
package excel
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"io"
|
|
"reflect"
|
|
|
|
"git.rosy.net.cn/baseapi/utils"
|
|
"git.rosy.net.cn/jx-callback/globals"
|
|
"github.com/360EntSecGroup-Skylar/excelize"
|
|
)
|
|
|
|
type Obj2ExcelSheetConfig struct {
|
|
Title string
|
|
Data interface{}
|
|
CaptionList []string
|
|
}
|
|
|
|
func Obj2Excel(sheetList []*Obj2ExcelSheetConfig) []byte {
|
|
globals.SugarLogger.Debug("Obj2Excel")
|
|
excelFile := excelize.NewFile()
|
|
for sheetIndex, sheetConfig := range sheetList {
|
|
obj := sheetConfig.Data
|
|
|
|
typeInfo := reflect.TypeOf(obj)
|
|
if typeInfo.Kind() == reflect.Ptr {
|
|
typeInfo = typeInfo.Elem()
|
|
}
|
|
if typeInfo.Kind() != reflect.Slice {
|
|
panic("obj must be slice type")
|
|
}
|
|
typeInfo = typeInfo.Elem()
|
|
if typeInfo.Kind() == reflect.Ptr {
|
|
typeInfo = typeInfo.Elem()
|
|
}
|
|
if typeInfo.Kind() != reflect.Struct && typeInfo.Kind() != reflect.Map {
|
|
panic("obj must be slice of map or struct")
|
|
}
|
|
|
|
valueInfo := reflect.Indirect(reflect.ValueOf(obj))
|
|
if sheetIndex == 0 {
|
|
sheetName := excelFile.GetSheetName(1)
|
|
excelFile.SetSheetName(sheetName, sheetConfig.Title)
|
|
} else {
|
|
excelFile.NewSheet(sheetConfig.Title)
|
|
}
|
|
for index, name := range sheetConfig.CaptionList {
|
|
excelFile.SetCellStr(sheetConfig.Title, genAxis(0, index), name)
|
|
}
|
|
for i := 0; i < valueInfo.Len(); i++ {
|
|
var mapData map[string]interface{}
|
|
if typeInfo.Kind() == reflect.Struct {
|
|
mapData = utils.FlatMap(utils.Struct2MapByJson(valueInfo.Index(i).Interface()))
|
|
} else {
|
|
mapData = valueInfo.Index(i).Interface().(map[string]interface{})
|
|
}
|
|
for index, name := range sheetConfig.CaptionList {
|
|
// globals.SugarLogger.Debug(sheetConfig.Title, " ", genAxis(i+1, index), " ", fmt.Sprintf("%v", mapData[name]))
|
|
excelFile.SetCellStr(sheetConfig.Title, genAxis(i+1, index), fmt.Sprintf("%v", mapData[name]))
|
|
}
|
|
}
|
|
}
|
|
buf := &bytes.Buffer{}
|
|
excelFile.Write(buf)
|
|
return buf.Bytes()
|
|
}
|
|
|
|
func Excel2Slice(reader io.Reader) (contents map[string][][]string) {
|
|
globals.SugarLogger.Debug("Excel2Slice")
|
|
if excelFile, err := excelize.OpenReader(reader); err == nil {
|
|
contents = make(map[string][][]string)
|
|
for _, v := range excelFile.GetSheetMap() {
|
|
contents[v], _ = excelFile.GetRows(v)
|
|
}
|
|
}
|
|
return contents
|
|
}
|
|
|
|
func genAxis(row, col int) string {
|
|
return fmt.Sprintf("%c%d", col+65, row+1)
|
|
}
|