82 lines
2.7 KiB
Go
82 lines
2.7 KiB
Go
// Package excel -----------------------------
|
|
// @file : writer.go
|
|
// @author : JJXu
|
|
// @contact : wavingbear@163.com
|
|
// @time : 2023/9/1 14:11
|
|
// -------------------------------------------
|
|
package excel
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"reflect"
|
|
)
|
|
|
|
var writerMap = map[reflect.Kind]func(exc *Excel, sheetObj Sheet, SheetData reflect.Value, SheetType reflect.Type, firstRow int) error{
|
|
reflect.Slice: sliceWriter,
|
|
reflect.Struct: structWriter,
|
|
}
|
|
|
|
func RegisterWriter(dataKind reflect.Kind, function func(exc *Excel, sheetObj Sheet, SheetData reflect.Value, SheetType reflect.Type, firstRow int) error) error {
|
|
if _, exists := writerMap[dataKind]; exists {
|
|
return errors.New(fmt.Sprintf("dataKind: %v has existed", dataKind))
|
|
}
|
|
writerMap[dataKind] = function
|
|
return nil
|
|
}
|
|
|
|
func sliceWriter(exc *Excel, sheetObj Sheet, SheetData reflect.Value, SheetDataType reflect.Type, firstRow int) error {
|
|
var cellNameList = sheetObj.GetJsonFiledList()
|
|
if cellNameList == nil {
|
|
cellNameList = exc.getJsonFieldList(SheetDataType)
|
|
}
|
|
var rowLen = SheetData.Len()
|
|
for i := 0; i < rowLen; i++ {
|
|
var dataMap = exc.dataToMap(SheetData.Index(i), SheetDataType)
|
|
for column, v := range cellNameList {
|
|
var axis = GetCellIndex(i+firstRow+1, column+1)
|
|
err := exc.ex.SetCellValue(sheetObj.SheetName(), axis, dataMap[v])
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
//设置数据格式
|
|
dataStyleID, errs := exc.ex.NewStyle(NewDefaultDataStyle())
|
|
if errs != nil {
|
|
return errs
|
|
}
|
|
if err := exc.ex.SetCellStyle(sheetObj.SheetName(), GetCellIndex(firstRow+1, 1), GetCellIndex(rowLen+1, len(sheetObj.SheetHeaders())), dataStyleID); err != nil {
|
|
return err
|
|
}
|
|
//设置默认列宽
|
|
//exc.ex.SetColWidth(sheetObj.SheetName(), GetColumnIndex(1), GetColumnIndex(len(sheetObj.SheetHeaders())), 12.0)
|
|
exc.autoResetCellWidth(sheetObj)
|
|
return nil
|
|
}
|
|
|
|
func structWriter(exc *Excel, sheetObj Sheet, SheetData reflect.Value, SheetType reflect.Type, firstRow int) error {
|
|
var cellNameList = exc.getJsonFieldList(SheetType)
|
|
var dataMap = exc.dataToMap(SheetData, SheetType)
|
|
for column, v := range cellNameList {
|
|
var axis = GetCellIndex(firstRow+1, column+1)
|
|
err := exc.ex.SetCellValue(sheetObj.SheetName(), axis, dataMap[v])
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
return err
|
|
}
|
|
}
|
|
//设置数据格式
|
|
dataStyleID, err := exc.ex.NewStyle(NewDefaultDataStyle())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if err = exc.ex.SetCellStyle(sheetObj.SheetName(), GetCellIndex(firstRow, 1), GetCellIndex(firstRow+1, len(sheetObj.SheetHeaders())), dataStyleID); err != nil {
|
|
return err
|
|
}
|
|
//设置默认列宽
|
|
//exc.ex.SetColWidth(sheetObj.SheetName(), GetColumnIndex(1), GetColumnIndex(len(sheetObj.SheetHeaders())), 12.0)
|
|
exc.autoResetCellWidth(sheetObj)
|
|
return nil
|
|
}
|