excel_utils.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package utils
  2. import (
  3. "fmt"
  4. "github.com/xuri/excelize/v2"
  5. "reflect"
  6. )
  7. type ExcelColMapping struct {
  8. Col string
  9. Field string
  10. }
  11. func ExportExcel[T any](sheetName string, cols map[string]ExcelColMapping, dataList []T) (file *excelize.File, err error) {
  12. // 创建一个新的 Excel 文件
  13. file = excelize.NewFile()
  14. // 创建一个工作表
  15. index, err := file.NewSheet(sheetName)
  16. if err != nil {
  17. FileLog.Error("创建工作表失败:", err)
  18. }
  19. err = file.DeleteSheet("Sheet1")
  20. // 设置工作表的标题行
  21. for k, v := range cols {
  22. err = file.SetCellValue(sheetName, fmt.Sprintf("%s%d", k, 1), v.Col)
  23. if err != nil {
  24. FileLog.Error("创建column失败:", err)
  25. return
  26. }
  27. }
  28. // 添加一些示例数据
  29. row := 2
  30. for _, item := range dataList {
  31. for k, v := range cols {
  32. err = file.SetCellValue(sheetName, fmt.Sprintf("%s%d", k, row), getValue(item, v.Field))
  33. if err != nil {
  34. FileLog.Error("创建数据失败:", err)
  35. return
  36. }
  37. }
  38. row++
  39. }
  40. // 设置活动工作表
  41. file.SetActiveSheet(index)
  42. return
  43. }
  44. func getValue[T any](val T, fieldName string) (value interface{}) {
  45. obj := reflect.ValueOf(val)
  46. fmt.Println(fieldName)
  47. fieldVal := obj.FieldByName(fieldName)
  48. if !fieldVal.IsValid() {
  49. FileLog.Error("无效的字段名:", fieldName)
  50. return
  51. }
  52. return fieldVal.Interface()
  53. }