package utils import ( "bytes" "fmt" "github.com/xuri/excelize/v2" "reflect" "strconv" ) // func Export(widths []int) (bool, error) { // f := excelize.NewFile() // defer func() { // _ = f.Close() // }() // // // 创建一个工作表 // index, err := f.NewSheet("Sheet1") // if err != nil { // return false, err // } // // // 设置工作簿的默认工作表 // f.SetActiveSheet(index) // // // 单元格对齐样式 // alignment := &excelize.Alignment{ // Horizontal: "center", // Vertical: "center", // } // // // 单元格颜色填充样式 // fill := excelize.Fill{ // Type: "pattern", // Pattern: 1, // Color: []string{"#c9daf8"}, // Shading: 0, // } // // // 第一行的左、右、下边框 // border := []excelize.Border{ // { // Type: "left,right,bottom", // Color: "", // Style: 1, // }, // } // // // 工作表样式 // style, err := f.NewStyle( // &excelize.Style{ // Fill: fill, // Alignment: alignment, // Border: border, // }, // ) // if err != nil { // return false, err // } // // // 依次设置每一列的列宽 // widths = []int{18, 18, 18, 18, 18, 20, 23, 46, 18, 30, 30, 18, 18, 30, 18, 30} // for col, width := range widths { // // 获取列名 // colName, err := excelize.ColumnNumberToName(col + 1) // if err != nil { // return false, err // } // // // 设置列宽 // err = f.SetColWidth("Sheet1", colName, colName, float64(width)) // if err != nil { // return false, err // } // // // 设置列背景颜色 // err = f.SetCellStyle("Sheet1", colName+"1", colName+"1", style) // if err != nil { // return false, err // } // } // // // 设置行高 // err = f.SetRowStyle("Sheet1", 1, 10, style) // if err != nil { // return false, err // } // // if err := f.SaveAs("output.xlsx"); err != nil { // return false, err // } // // return true, nil // } // HeaderCellData 表头内容 type HeaderCellData struct { Value string // 值 CellType string // 类型 NumberFmt string // 格式化方式 ColWidth int // 列宽 } func Export(header []HeaderCellData, data []interface{}) (*bytes.Buffer, error) { sheetName := "Sheet1" f := excelize.NewFile() defer func() { _ = f.Close() }() // 创建一个工作表 index, err := f.NewSheet(sheetName) if err != nil { return nil, err } // 设置工作簿的默认工作表 f.SetActiveSheet(index) // 设置工作表默认字体 err = f.SetDefaultFont("宋体") if err != nil { return nil, err } // 统一单元格对齐样式 alignment := &excelize.Alignment{ Horizontal: "center", Vertical: "center", } // 设置行高 35-第一行 err = f.SetRowHeight(sheetName, 1, 35) if err != nil { return nil, err } // 处理工作表表头 for c, cell := range header { // 获取列名 colName, err := excelize.ColumnNumberToName(c + 1) if err != nil { return nil, err } // 添加单元格的值 err = f.SetCellValue(sheetName, colName+"1", cell.Value) if err != nil { return nil, err } // 单元格颜色填充样式 fill := excelize.Fill{ Type: "pattern", Pattern: 1, Color: []string{"#c9daf8"}, Shading: 0, } // 第一行的左、右、下边框 border := []excelize.Border{ { Type: "left", Color: "#000000", Style: 1, }, { Type: "right", Color: "#000000", Style: 1, }, { Type: "bottom", Color: "#000000", Style: 1, }, } // 设置单元格值类型和格式 style, _ := f.NewStyle(&excelize.Style{ Alignment: alignment, // 字体居中 Fill: fill, // 背景颜色 Border: border, // 边框 }) err = f.SetCellStyle(sheetName, colName+"1", colName+"1", style) if err != nil { return nil, err } // 设置列宽 err = f.SetColWidth(sheetName, colName, colName, float64(cell.ColWidth)) if err != nil { return nil, err } } // 设置单元格格式 row := len(data) for i, cell := range header { // 获取列名 colName, err := excelize.ColumnNumberToName(i + 1) if err != nil { return nil, err } // 字体居中 style := &excelize.Style{} style = &excelize.Style{ Alignment: alignment, } if cell.CellType == "float" { style.NumFmt = 2 customNumFmt := "0.000" style.CustomNumFmt = &customNumFmt } if cell.CellType == "date" { style.NumFmt = 22 customNumFmt := "yyyy-mm-dd hh:mm:ss" style.CustomNumFmt = &customNumFmt } newStyle, _ := f.NewStyle(style) err = f.SetCellStyle(sheetName, colName+"2", colName+strconv.Itoa(row), newStyle) if err != nil { return nil, err } } // 填充数据 for r, rowData := range data { rv := reflect.ValueOf(rowData) for c := 0; c < rv.NumField(); c++ { cellValue := rv.Field(c).Interface() // 获取列名 colName, err := excelize.ColumnNumberToName(c + 1) if err != nil { return nil, err } axis := colName + fmt.Sprintf("%d", r+2) // 设置单元格值 err = f.SetCellValue(sheetName, axis, cellValue) if err != nil { return nil, err } // 设置单元格值类型 cellType := header[c].CellType // 字体居中 style := &excelize.Style{} style = &excelize.Style{ Alignment: alignment, } if cellType == "float" { style.NumFmt = 2 customNumFmt := "0.000" style.CustomNumFmt = &customNumFmt } if cellType == "date" { style.NumFmt = 22 customNumFmt := "yyyy-mm-dd hh:mm:ss" style.CustomNumFmt = &customNumFmt } newStyle, _ := f.NewStyle(style) err = f.SetCellStyle(sheetName, axis, axis, newStyle) if err != nil { return nil, err } // 设置行高 35-第一行 err = f.SetRowHeight(sheetName, r+2, 35) if err != nil { return nil, err } } } buffer, err := f.WriteToBuffer() if err != nil { return nil, err } return buffer, nil // 保存文件 // if err := f.SaveAs("output.xlsx"); err != nil { // return nil, err // } // return nil, errors.New("已导出文件") }