file.go 1005 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. package utils
  2. import (
  3. "github.com/xuri/excelize/v2"
  4. "reflect"
  5. )
  6. func ExportExcelFile[T any](headers []string, data []T, savePath string) {
  7. if savePath == "" || len(data) == 0 {
  8. return
  9. }
  10. f := excelize.NewFile()
  11. sheetName := "Sheet1"
  12. if err := f.SetSheetName("Sheet1", sheetName); err != nil {
  13. return
  14. }
  15. // 写入表头
  16. for i, header := range headers {
  17. cell, _ := excelize.CoordinatesToCellName(i+1, 1)
  18. if err := f.SetCellValue(sheetName, cell, header); err != nil {
  19. return
  20. }
  21. }
  22. // 使用反射获取结构体字段值
  23. for rowIndex, row := range data {
  24. rowValue := reflect.ValueOf(row)
  25. for colIndex := 0; colIndex < rowValue.NumField(); colIndex++ {
  26. cell, _ := excelize.CoordinatesToCellName(colIndex+1, rowIndex+2)
  27. field := rowValue.Field(colIndex)
  28. if field.CanInterface() {
  29. if err := f.SetCellValue(sheetName, cell, field.Interface()); err != nil {
  30. return
  31. }
  32. }
  33. }
  34. }
  35. // 保存 Excel 文件
  36. if err := f.SaveAs(savePath); err != nil {
  37. return
  38. }
  39. }