-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwriter.go
122 lines (106 loc) · 3.05 KB
/
writer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package excel
import (
"github.com/xuri/excelize/v2"
)
type Writer interface {
Write(sheetName string, CellName string, data interface{}) error
WriteList(list []DataRef) error
SaveAs(filePath string) error
ToBytes() ([]byte, error)
}
type excelWriter struct {
file *excelize.File
}
func NewWriter(file *excelize.File) Writer {
return &excelWriter{file: file}
}
func (e *excelWriter) Write(sheetName string, colName string, data interface{}) error {
sheetVisible, _ := e.file.GetSheetVisible(sheetName)
if !sheetVisible {
err := e.file.SetSheetName("Sheet1", sheetName)
if err != nil {
return err
}
}
return e.file.SetCellValue(sheetName, colName, data)
}
func (e *excelWriter) WriteList(list []DataRef) error {
for _, data := range list {
if data.TextColor != "" {
style, err := e.file.NewStyle(&excelize.Style{Font: &excelize.Font{Color: data.TextColor}})
if err != nil {
return err
}
err = e.file.SetCellStyle(data.SheetName, data.CellName, data.CellName, style)
if err != nil {
return err
}
}
if data.CellFormula != "" {
err := e.file.SetCellFormula(data.SheetName, data.CellName, data.CellFormula)
if err != nil {
return err
}
}
err := e.Write(data.SheetName, data.CellName, data.Data)
if err != nil {
return err
}
}
return nil
}
func (e *excelWriter) ToBytes() ([]byte, error) {
return ToBytes(e.file)
}
func (e *excelWriter) SaveAs(filePath string) error {
return e.file.SaveAs(filePath)
}
/*
GenerateExcelAsBytes for create excel by configs
var configs []excel.GenerateExcelConfig[models.ActivityData]
configs = append(configs, excel.GenerateExcelConfig[models.ActivityData]{
Header: "Test1",
Value: func(obj *models.ActivityData) string {
return obj.ID
},
})
configs = append(configs, excel.GenerateExcelConfig[models.ActivityData]{
Header: "Test1",
Value: func(obj *models.ActivityData) string {
return obj.ID
},
})
dataList, _, err := repositoryRegistry.ActivityRepository.List(ctx, &models.ActivityListRequest{
Limit: coremodels.MaxLimitForQuery,
})
dataBytes, err := excel.GenerateExcelAsBytes("Data", excel.FirstRowIndex, &configs, dataList)
utils.WriteFile("test.xlsx", dataBytes)
*/
func GenerateExcelAsBytes[T any](sheetName string, startAtRowIndex int, configs *[]GenerateExcelConfig[T], dataList *[]T) ([]byte, error) {
f := excelize.NewFile()
defer Close(f)
excelWriter := NewWriter(f)
var list []DataRef
currentRow := startAtRowIndex
for cellIndex, config := range *configs {
list = append(list, DataRef{SheetName: sheetName, CellName: ToCellName(cellIndex, currentRow), Data: config.Header})
}
if dataList != nil && len(*dataList) > 0 {
for _, row := range *dataList {
data := row
currentRow++
for cellIndex, config := range *configs {
list = append(list, DataRef{SheetName: sheetName, CellName: ToCellName(cellIndex, currentRow), Data: config.Value(&data)})
}
}
}
err := excelWriter.WriteList(list)
if err != nil {
return nil, err
}
fileBytes, err := excelWriter.ToBytes()
if err != nil {
return nil, err
}
return fileBytes, nil
}