kobe6258 5 ماه پیش
والد
کامیت
b447fe3984
2فایلهای تغییر یافته به همراه58 افزوده شده و 32 حذف شده
  1. 28 20
      controllers/user.go
  2. 30 12
      utils/excel_utils.go

+ 28 - 20
controllers/user.go

@@ -7,6 +7,7 @@ import (
 	"eta/eta_mini_crm_ht/utils"
 	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/xuri/excelize/v2"
 	"net/http"
 	"net/url"
 	"strconv"
@@ -18,6 +19,15 @@ type UserController struct {
 	BaseAuthController
 }
 
+var (
+	templateCols = map[string]utils.ExcelColMapping{
+		"A": {"手机号", "Mobile"},
+		"B": {"最近一次阅读时间", "LastReadTime"},
+		"C": {"累计阅读次数", "ReadCount"},
+		"D": {"注册时间", "CreatedTime"},
+	}
+)
+
 // TemplateList
 // @Title 临时用户列表
 // @Description 临时用户列表
@@ -424,15 +434,28 @@ func (this *UserController) ExportTemplateUsers() {
 		br.Msg = "查询用户失败,系统错误,Err:" + err.Error()
 		return
 	}
+	list := make([]models.TemplateUsersItem, 0)
+	for _, v := range userList {
+		list = append(list, v.ToItem())
+	}
 	year, month, day := time.Now().Date()
 	yearStr := strconv.Itoa(year)[2:]
 	fileName := fmt.Sprintf("临时用户表%s.%d.%d.xlsx", yearStr, month, day)
-	// https://tools.ietf.org/html/rfc6266#section-4.3
-	fn := url.PathEscape(fileName)
-	if fileName == fn {
+	file, err := utils.ExportExcel("用户列表", templateCols, models.TemplateUsersItem{}, list)
+	_ = this.downloadExcelFile(file, fileName)
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "下载成功"
+}
+
+// encodeChineseFilename 将中文文件名编码为 ISO-8859-1
+func (this *UserController) downloadExcelFile(file *excelize.File, filename string) (err error) {
+	// 对文件名进行 ISO-8859-1 编码
+	fn := url.PathEscape(filename)
+	if filename == fn {
 		fn = "filename=" + fn
 	} else {
-		fn = "filename=" + fileName + "; filename*=utf-8''" + fn
+		fn = "filename=" + filename + "; filename*=utf-8''" + fn
 	}
 	this.Ctx.ResponseWriter.Header().Set("Content-Disposition", "attachment; "+fn)
 	this.Ctx.ResponseWriter.Header().Set("Content-Description", "File Transfer")
@@ -441,27 +464,12 @@ func (this *UserController) ExportTemplateUsers() {
 	this.Ctx.ResponseWriter.Header().Set("Expires", "0")
 	this.Ctx.ResponseWriter.Header().Set("Cache-Control", "must-revalidate")
 	this.Ctx.ResponseWriter.Header().Set("Pragma", "public")
-	list := make([]models.TemplateUsersItem, 0)
-	for _, v := range userList {
-		list = append(list, v.ToItem())
-	}
-
-	file, err := utils.ExportExcel(fileName, "用户列表", map[string]string{"用户名": "UserName", "手机号": "Mobile"}, nil)
 	// 写入文件
 	if err = file.Write(this.Ctx.ResponseWriter); err != nil {
 		utils.FileLog.Error("导出excel文件失败:", err)
 		http.Error(this.Ctx.ResponseWriter, "导出excel文件失败", http.StatusInternalServerError)
 	}
-	br.Ret = 200
-	br.Success = true
-	br.Msg = "获取成功"
-}
-
-// encodeChineseFilename 将中文文件名编码为 ISO-8859-1
-func encodeChineseFilename(filename string) string {
-	// 对文件名进行 ISO-8859-1 编码
-	encodedFilename := fmt.Sprintf("attachment; filename=%s", filename)
-	return encodedFilename
+	return
 }
 
 // ExportOfficialUsers

+ 30 - 12
utils/excel_utils.go

@@ -1,38 +1,56 @@
 package utils
 
 import (
+	"fmt"
 	"github.com/xuri/excelize/v2"
+	"reflect"
 )
 
-func ExportExcel(fileName, sheetName string, cols map[string]string, dataList []interface{}) (file *excelize.File, err error) {
+type ExcelColMapping struct {
+	Col   string
+	Field string
+}
+
+func ExportExcel[T any](sheetName string, cols map[string]ExcelColMapping, dataType T, dataList []T) (file *excelize.File, err error) {
 	// 创建一个新的 Excel 文件
 	file = excelize.NewFile()
-
 	// 创建一个工作表
 	index, err := file.NewSheet(sheetName)
 	if err != nil {
 		FileLog.Error("创建工作表失败:", err)
 	}
+	err = file.DeleteSheet("Sheet1")
 	// 设置工作表的标题行
 	for k, v := range cols {
-		err = file.SetCellValue(sheetName, k, v)
+		err = file.SetCellValue(sheetName, fmt.Sprintf("%s%d", k, 1), v.Col)
 		if err != nil {
 			FileLog.Error("创建column失败:", err)
 			return
 		}
 	}
 	// 添加一些示例数据
-	// 将数据写入工作表
-	//row := 2
-	//for _, item := range dataList {
-	//	file.SetCellValue("Sheet1", fmt.Sprintf("A%d", row), item.ID)
-	//	file.SetCellValue("Sheet1", fmt.Sprintf("B%d", row), item.Name)
-	//	file.SetCellValue("Sheet1", fmt.Sprintf("C%d", row), item.Age)
-	//	file.SetCellValue("Sheet1", fmt.Sprintf("D%d", row), item.CreatedAt.Format("2006-01-02 15:04:05"))
-	//	row++
-	//}
+	row := 2
+	for _, item := range dataList {
+		for k, v := range cols {
+			err = file.SetCellValue(sheetName, fmt.Sprintf("%s%d", k, row), getValue(item, v.Field))
+			if err != nil {
+				FileLog.Error("创建数据失败:", err)
+				return
+			}
+		}
+		row++
+	}
 
 	// 设置活动工作表
 	file.SetActiveSheet(index)
 	return
 }
+func getValue[T any](val T, fieldName string) (value interface{}) {
+	obj := reflect.ValueOf(val)
+	fieldVal := obj.FieldByName(fieldName)
+	if !fieldVal.IsValid() {
+		FileLog.Error("无效的字段名:", fieldName)
+		return
+	}
+	return fieldVal.Interface()
+}