excel.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package utils
  2. import (
  3. "fmt"
  4. "reflect"
  5. "github.com/xuri/excelize/v2"
  6. )
  7. var Cols = []string{"", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}
  8. // WriteXlsx 填充excel
  9. func WriteXlsx(sheet string, records interface{}) *excelize.File {
  10. xlsx := excelize.NewFile() // new file
  11. index, _ := xlsx.NewSheet(sheet) // new sheet
  12. xlsx.SetActiveSheet(index) // set active (default) sheet
  13. t := reflect.TypeOf(records)
  14. if t.Kind() != reflect.Slice {
  15. return xlsx
  16. }
  17. s := reflect.ValueOf(records)
  18. for i := 0; i < s.Len(); i++ {
  19. elem := s.Index(i).Interface()
  20. elemType := reflect.TypeOf(elem)
  21. elemValue := reflect.ValueOf(elem)
  22. index := -1
  23. for j := 0; j < elemType.NumField(); j++ {
  24. field := elemType.Field(j)
  25. tag := field.Tag.Get("xlsx")
  26. name := tag
  27. if tag == "" || tag == "-" {
  28. continue
  29. }
  30. index++
  31. if index == -1 {
  32. continue
  33. }
  34. column, _ := ConvertNumToChars(index)
  35. // 设置表头
  36. if i == 0 {
  37. err := xlsx.SetCellValue(sheet, fmt.Sprintf("%s%d", column, i+1), name)
  38. if err != nil {
  39. return nil
  40. }
  41. }
  42. // 设置内容
  43. err := xlsx.SetCellValue(sheet, fmt.Sprintf("%s%d", column, i+2), elemValue.Field(j).Interface())
  44. if err != nil {
  45. return nil
  46. }
  47. }
  48. }
  49. return xlsx
  50. }
  51. func ConvertNumToChars(num int) (string, error) {
  52. var cols string
  53. v := num + 1
  54. for v > 0 {
  55. k := v % 26
  56. if k == 0 {
  57. k = 26
  58. }
  59. v = (v - k) / 26
  60. cols = Cols[k] + cols
  61. }
  62. return cols, nil
  63. }