Files
jx-callback/business/jxutils/excel/excel.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)
}