299 lines
5.9 KiB
Go
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
|
|
// }
|
|
|
|
// HeaderCellData1 表头内容
|
|
type HeaderCellData1 struct {
|
|
Value string // 值
|
|
CellType string // 类型
|
|
NumberFmt string // 格式化方式
|
|
ColWidth int // 列宽
|
|
}
|
|
|
|
func Export2(header []HeaderCellData1, 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("已导出文件")
|
|
}
|