阅读量:0
经常会遇到需要导出数据报表的需求,除了可以通过 encoding/csv
导出 CSV 以外,还可以使用https://github.com/qax-os/excelize
导出 xlsx 等格式的 excel,下面封装了一个方法,支持多 sheet 的 excel 数据生成,导出按需在接口实现层添加 f.SaveAs("xxx.xlsx")
即可
package excel import ( "fmt" "github.com/xuri/excelize/v2" ) type SheetData struct { SheetName string Headers []string Rows [][]interface{} } // GenerateExcelBySheets 生成 excel 表格 func GenerateExcelBySheets(sheets []SheetData) (*excelize.File, error) { f := excelize.NewFile() for _, sheet := range sheets { if _, err := f.NewSheet(sheet.SheetName); err != nil { return nil, err } for i, header := range sheet.Headers { if err := f.SetCellValue(sheet.SheetName, GetCellName(i, 1), header); err != nil { return nil, err } } baseIndex := 2 if len(sheet.Headers) == 0 { baseIndex = 1 } for i, row := range sheet.Rows { for j, val := range row { if err := f.SetCellValue(sheet.SheetName, GetCellName(j, baseIndex+i), val); err != nil { return nil, err } } } } if len(sheets) > 0 { f.SetActiveSheet(0) } return f, nil } // GetColumnName 获取列名 A-Z, AA-ZZ, AAA-ZZZ func GetColumnName(col int) string { if col < 26 { return string(rune('A' + col)) } return GetColumnName(col/26-1) + GetColumnName(col%26) } // GetCellName 获取单元格名称 A1, B2, AA1, AB1 func GetCellName(col, row int) string { return fmt.Sprintf("%s%d", GetColumnName(col), row) }