Browse Source

1. 将saveExcelFile方法从utils包下的utils文件夹中移到grmi包下的export的文件中,用于解决循环导入

2. saveExcelFile方法对传如的结构体字段类型做判断若为grmi.Date或grmi.DateTime则调用ToString方法 转换成字符串
pull/32/head
zhangxin 3 years ago
parent
commit
ccf6550483
2 changed files with 110 additions and 68 deletions
  1. +110
    -0
      grmi/export.go
  2. +0
    -68
      utils/utils.go

+ 110
- 0
grmi/export.go View File

@ -0,0 +1,110 @@
/******************************************************************************
* @Function Name :
*-----------------------------------------------------------------------------
* @Description :
* @Function Parameters:
* @Return Value :
* @Author : Zhang Xin
* @Date : 2021/3/3 11:02
******************************************************************************/
package grmi
import (
"LAPP_GAAS_GFrame_BACKEND/utils"
"errors"
"fmt"
"github.com/360EntSecGroup-Skylar/excelize/v2"
"reflect"
)
/******************************************************************************
*
* @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 {
fmt.Println("errors:", err.Error())
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 {
fmt.Println(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
}
return filepath, nil
}

+ 0
- 68
utils/utils.go View File

@ -3,7 +3,6 @@ package utils
import (
"errors"
"fmt"
"github.com/360EntSecGroup-Skylar/excelize/v2"
"github.com/lianggx6/goutf16"
"io"
"math/rand"
@ -389,70 +388,3 @@ func FileExist(file string) bool {
return true
}
/******************************************************************************
*
* @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{}, sheetName string, prefixFilename string) (filepath string, err error) {
file := excelize.NewFile()
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())
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 {
fmt.Println(err)
}
}
typeOfS := reflect.ValueOf(item)
row := make([]interface{}, typeOfS.NumField())
for i := 0; i < typeOfS.NumField(); i++ {
row[i] = typeOfS.Field(i)
}
cell, _:= excelize.CoordinatesToCellName(1, index+2)
if err := streamWriter.SetRow(cell, row); err != nil {
fmt.Println(err)
}
}
if err := streamWriter.Flush(); err != nil {
fmt.Println(err)
}
filename := MakeOrderSn(prefixFilename) + ".xlsx"
dirname, err := GetCurrentPath("web/public/uploadxlsx")
if err != nil {
return "", err
}
filepath = dirname + "/" + filename
err = file.SaveAs(filepath)
if err != nil {
return "", err
}
return filepath, nil
}

Loading…
Cancel
Save