local_file.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package core
  2. import (
  3. "fmt"
  4. "github.com/xuri/excelize/v2"
  5. "os"
  6. "path/filepath"
  7. "reflect"
  8. "time"
  9. )
  10. // 获取文件名
  11. func GetCsvFileName(dir string) string {
  12. filename := fmt.Sprintf("%s_%d.xlsx", dir, time.Now().Unix())
  13. return filename
  14. }
  15. // 获取csv文件的路径
  16. func GetCsvPath(filename string, dir string) string {
  17. execPath, err := os.Executable()
  18. if err != nil {
  19. return ""
  20. }
  21. // 获取可执行文件目录并构造目标路径
  22. baseDir := filepath.Dir(execPath)
  23. excelPath := filepath.Join(baseDir, "uploads", dir, filename)
  24. // 创建目录(如果不存在)
  25. if err := os.MkdirAll(filepath.Dir(excelPath), os.ModePerm); err != nil {
  26. return ""
  27. }
  28. return excelPath
  29. }
  30. // 导出表格
  31. func ExportExcel[T any](headers []string, data []T, savePath string) (string, error) {
  32. if savePath == "" {
  33. return "", fmt.Errorf("获取文件路径失败")
  34. }
  35. f := excelize.NewFile()
  36. var err error
  37. sheetName := "Sheet1"
  38. err = f.SetSheetName("Sheet1", sheetName)
  39. if err != nil {
  40. return "", err
  41. }
  42. // 写入表头
  43. for i, header := range headers {
  44. cell, _ := excelize.CoordinatesToCellName(i+1, 1)
  45. err = f.SetCellValue(sheetName, cell, header)
  46. if err != nil {
  47. return "", err
  48. }
  49. }
  50. // 使用反射获取结构体字段值
  51. for rowIndex, row := range data {
  52. rowValue := reflect.ValueOf(row)
  53. for colIndex := 0; colIndex < rowValue.NumField(); colIndex++ {
  54. cell, _ := excelize.CoordinatesToCellName(colIndex+1, rowIndex+2)
  55. field := rowValue.Field(colIndex)
  56. if field.CanInterface() {
  57. err = f.SetCellValue(sheetName, cell, field.Interface())
  58. if err != nil {
  59. return "", err
  60. }
  61. }
  62. }
  63. }
  64. // 保存 Excel 文件
  65. if err := f.SaveAs(savePath); err != nil {
  66. return "", fmt.Errorf("保存文件失败: %v", err)
  67. }
  68. return savePath, nil
  69. }