excel.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package utilx
  2. import (
  3. "fmt"
  4. "github.com/xuri/excelize/v2"
  5. )
  6. func Xlsx(data [][]interface{}, sheetName string) (*excelize.File, error) {
  7. f := excelize.NewFile()
  8. index := 0
  9. oldName := f.GetSheetName(index)
  10. err := f.SetSheetName(oldName, sheetName)
  11. if err != nil {
  12. return nil, fmt.Errorf("SetSheetName failed: %s", err.Error())
  13. }
  14. // 遍历二维字符串数组并写入数据到Excel文件
  15. for rowIdx, rowData := range data {
  16. for colIdx, cellData := range rowData {
  17. cell, err := excelize.CoordinatesToCellName(colIdx+1, rowIdx+1) // Excel索引从1开始
  18. if err != nil {
  19. return nil, fmt.Errorf("CoordinatesToCellName failed: %s", err.Error())
  20. }
  21. err = f.SetCellValue(sheetName, cell, cellData)
  22. if err != nil {
  23. return nil, fmt.Errorf("SetCellValue failed: %s", err.Error())
  24. }
  25. }
  26. }
  27. return f, nil
  28. }
  29. // XlsxV2 流式写入,节约内存 ps.生产内存限制512M
  30. func XlsxV2(data [][]interface{}, sheetName string) (*excelize.File, error) {
  31. f := excelize.NewFile()
  32. index := 0
  33. oldName := f.GetSheetName(index)
  34. err := f.SetSheetName(oldName, sheetName)
  35. if err != nil {
  36. return nil, fmt.Errorf("SetSheetName failed: %s", err.Error())
  37. }
  38. writer, err := f.NewStreamWriter(sheetName)
  39. if err != nil {
  40. return nil, fmt.Errorf("f.NewStreamWriter failed, err: %v", err)
  41. }
  42. // 遍历二维字符串数组并写入数据到Excel文件
  43. for rowIdx, rowData := range data {
  44. cell, err := excelize.CoordinatesToCellName(1, rowIdx+1) // Excel索引从1开始
  45. if err != nil {
  46. return nil, fmt.Errorf("CoordinatesToCellName failed: %s", err.Error())
  47. }
  48. err = writer.SetRow(cell, rowData)
  49. if err != nil {
  50. return nil, fmt.Errorf("writer.SetRow failed, err: %v", err)
  51. }
  52. }
  53. err = writer.Flush()
  54. if err != nil {
  55. return nil, fmt.Errorf("writer.Flush failed, err: %v", err)
  56. }
  57. return f, nil
  58. }