hepa-calc-api/utils/export.go
2024-07-09 13:12:31 +08:00

299 lines
5.9 KiB
Go

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("已导出文件")
}