GAAS GFrame项目web后台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

104 lines
3.0 KiB

  1. package grmi
  2. import (
  3. "LAPP_GAAS_GFrame_BACKEND/utils"
  4. "errors"
  5. "github.com/360EntSecGroup-Skylar/excelize/v2"
  6. "reflect"
  7. "strings"
  8. )
  9. /******************************************************************************
  10. *
  11. * @Function Name : SaveExcelFile
  12. *-----------------------------------------------------------------------------
  13. *
  14. * @Description : 把传入的[]interface 数据保存成excel
  15. *
  16. * @Function Parameters : []interface{} 需要保存的数据切片
  17. *
  18. * @Function Parameters : sheetName excel sheet名称
  19. *
  20. * @Function Parameters : prefixFilename 保存文件的前缀名称 后面会有自动添加时间和文件类型后缀
  21. *
  22. * @Return Value : filepath 文件路径
  23. *
  24. * @Return Value : err 执行出现的错误
  25. *
  26. * @Author : zhangxin
  27. *
  28. * @Date : 2021-03-19
  29. *
  30. ******************************************************************************/
  31. func SaveExcelFile(list []interface{}, titleList []string, sheetName string, prefixFilename string) (filepath string, err error) {
  32. file := excelize.NewFile()
  33. if sheetName != "Sheet1" {
  34. file.NewSheet(sheetName)
  35. file.DeleteSheet("Sheet1")
  36. }
  37. streamWriter, err := file.NewStreamWriter(sheetName)
  38. if err != nil {
  39. return "", err
  40. }
  41. for index, item := range list {
  42. if index == 0 {
  43. typeOfS := reflect.TypeOf(item)
  44. row := make([]interface{}, typeOfS.NumField())
  45. if len(titleList) != 0 {
  46. if len(titleList) != typeOfS.NumField() {
  47. return "", errors.New("titleList和item字段数量不相等")
  48. }
  49. for i := 0; i < typeOfS.NumField(); i++ {
  50. row[i] = titleList[i]
  51. }
  52. } else {
  53. for i := 0; i < typeOfS.NumField(); i++ {
  54. row[i] = typeOfS.Field(i).Name
  55. }
  56. }
  57. cell, _ := excelize.CoordinatesToCellName(1, 1)
  58. if err := streamWriter.SetRow(cell, row); err != nil {
  59. return "", err
  60. }
  61. }
  62. reflectValue := reflect.ValueOf(item)
  63. row := make([]interface{}, reflectValue.NumField())
  64. for i := 0; i < reflectValue.NumField(); i++ {
  65. var date Date
  66. var datetime DateTime
  67. if reflect.TypeOf(date) == reflectValue.Field(i).Type() {
  68. filed := reflectValue.Field(i).Interface().(Date)
  69. row[i] = filed.ToString()
  70. } else if reflect.TypeOf(datetime) == reflectValue.Field(i).Type() {
  71. filed := reflectValue.Field(i).Interface().(DateTime)
  72. row[i] = filed.ToString()
  73. } else {
  74. row[i] = reflectValue.Field(i)
  75. }
  76. }
  77. cell, _ := excelize.CoordinatesToCellName(1, index+2)
  78. if err := streamWriter.SetRow(cell, row); err != nil {
  79. return "", err
  80. }
  81. }
  82. if err := streamWriter.Flush(); err != nil {
  83. return "", err
  84. }
  85. filename := utils.MakeOrderSn(prefixFilename) + ".xlsx"
  86. dirname, err := utils.GetCurrentPath("web/public/uploadxlsx")
  87. if err != nil {
  88. return "", err
  89. }
  90. filepath = dirname + "/" + filename
  91. err = file.SaveAs(filepath)
  92. if err != nil {
  93. return "", err
  94. }
  95. pathLi := strings.Split(filepath, "web\\")
  96. if len(pathLi) != 2 {
  97. return "", errors.New("导出失败,请重试")
  98. }
  99. return pathLi[1], nil
  100. }