package excel import ( "bytes" "fmt" "io" "reflect" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/globals" "github.com/360EntSecGroup-Skylar/excelize" "github.com/fatih/structs" ) 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 = jxutils.FlatMap(structs.Map(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) }