|
|
- package grmi
-
- import (
- "LAPP_GAAS_GFrame_BACKEND/utils"
- "errors"
- "github.com/360EntSecGroup-Skylar/excelize/v2"
- "reflect"
- "strings"
- )
-
- /******************************************************************************
- *
- * @Function Name : SaveExcelFile
- *-----------------------------------------------------------------------------
- *
- * @Description : 把传入的[]interface 数据保存成excel
- *
- * @Function Parameters : []interface{} 需要保存的数据切片
- *
- * @Function Parameters : sheetName excel sheet名称
- *
- * @Function Parameters : prefixFilename 保存文件的前缀名称 后面会有自动添加时间和文件类型后缀
- *
- * @Return Value : filepath 文件路径
- *
- * @Return Value : err 执行出现的错误
- *
- * @Author : zhangxin
- *
- * @Date : 2021-03-19
- *
- ******************************************************************************/
- func SaveExcelFile(list []interface{}, titleList []string, sheetName string, prefixFilename string) (filepath string, err error) {
- file := excelize.NewFile()
- if sheetName != "Sheet1" {
- file.NewSheet(sheetName)
- file.DeleteSheet("Sheet1")
- }
- streamWriter, err := file.NewStreamWriter(sheetName)
- if err != nil {
- return "", err
- }
- for index, item := range list {
- if index == 0 {
- typeOfS := reflect.TypeOf(item)
- row := make([]interface{}, typeOfS.NumField())
- if len(titleList) != 0 {
- if len(titleList) != typeOfS.NumField() {
- return "", errors.New("titleList和item字段数量不相等")
- }
- for i := 0; i < typeOfS.NumField(); i++ {
- row[i] = titleList[i]
- }
-
- } else {
- for i := 0; i < typeOfS.NumField(); i++ {
- row[i] = typeOfS.Field(i).Name
- }
- }
-
- cell, _ := excelize.CoordinatesToCellName(1, 1)
- if err := streamWriter.SetRow(cell, row); err != nil {
- return "", err
- }
- }
- reflectValue := reflect.ValueOf(item)
- row := make([]interface{}, reflectValue.NumField())
- for i := 0; i < reflectValue.NumField(); i++ {
- var date Date
- var datetime DateTime
- if reflect.TypeOf(date) == reflectValue.Field(i).Type() {
- filed := reflectValue.Field(i).Interface().(Date)
- row[i] = filed.ToString()
- } else if reflect.TypeOf(datetime) == reflectValue.Field(i).Type() {
- filed := reflectValue.Field(i).Interface().(DateTime)
- row[i] = filed.ToString()
- } else {
- row[i] = reflectValue.Field(i)
- }
- }
- cell, _ := excelize.CoordinatesToCellName(1, index+2)
- if err := streamWriter.SetRow(cell, row); err != nil {
- return "", err
- }
- }
- if err := streamWriter.Flush(); err != nil {
- return "", err
- }
- filename := utils.MakeOrderSn(prefixFilename) + ".xlsx"
- dirname, err := utils.GetCurrentPath("web/public/uploadxlsx")
- if err != nil {
- return "", err
- }
- filepath = dirname + "/" + filename
- err = file.SaveAs(filepath)
- if err != nil {
- return "", err
- }
- pathLi := strings.Split(filepath, "web\\")
- if len(pathLi) != 2 {
- return "", errors.New("导出失败,请重试")
- }
- return pathLi[1], nil
- }
|