package utils import ( "github.com/xuri/excelize/v2" "reflect" ) func ExportExcelFile[T any](headers []string, data []T, savePath string) { if savePath == "" || len(data) == 0 { return } f := excelize.NewFile() sheetName := "Sheet1" if err := f.SetSheetName("Sheet1", sheetName); err != nil { return } // 写入表头 for i, header := range headers { cell, _ := excelize.CoordinatesToCellName(i+1, 1) if err := f.SetCellValue(sheetName, cell, header); err != nil { return } } // 使用反射获取结构体字段值 for rowIndex, row := range data { rowValue := reflect.ValueOf(row) for colIndex := 0; colIndex < rowValue.NumField(); colIndex++ { cell, _ := excelize.CoordinatesToCellName(colIndex+1, rowIndex+2) field := rowValue.Field(colIndex) if field.CanInterface() { if err := f.SetCellValue(sheetName, cell, field.Interface()); err != nil { return } } } } // 保存 Excel 文件 if err := f.SaveAs(savePath); err != nil { return } }