-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfacade.go
More file actions
122 lines (106 loc) · 2.99 KB
/
facade.go
File metadata and controls
122 lines (106 loc) · 2.99 KB
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 dgexcel
import (
"fmt"
"os"
"strings"
dgcoll "github.com/darwinOrg/go-common/collection"
dgctx "github.com/darwinOrg/go-common/context"
dgerr "github.com/darwinOrg/go-common/enums/error"
dglogger "github.com/darwinOrg/go-logger"
)
func SimpleBindExcel2Struct[T any](ctx *dgctx.DgContext, filePath string) ([]*T, error) {
return BindExcel2Struct[T](ctx, filePath, 1, 2)
}
func BindExcelUsingTargetBuilder(ctx *dgctx.DgContext, filePath string, headerRow int, dataStartRow int, targetBuilderFn func() any) ([]any, error) {
file, err := os.Open(filePath)
if err != nil {
dglogger.Errorf(ctx, "open excel file error: %v", err)
return nil, err
}
defer func(f *os.File) {
err := f.Close()
if err != nil {
dglogger.Errorf(ctx, "close excel file error: %v", err)
}
}(file)
p, err := newParser(targetBuilderFn())
if err != nil {
dglogger.Errorf(ctx, "new parser error: %v", err)
return nil, err
}
rt, err := p.ParseContent(file, headerRow, dataStartRow)
if err != nil {
dglogger.Errorf(ctx, "parse content error: %v", err)
return nil, err
}
errList, has := rt.HasError()
if has {
var errs []string
for k, v := range errList {
dglogger.Warn(ctx, k, v)
egs := dgcoll.MapToList(v, func(s string) string { return fmt.Sprintf("第%d行:%s", k, s) })
errs = append(errs, egs...)
}
return nil, dgerr.SimpleDgError(strings.Join(errs, "\n"))
}
ts, err := rt.FormatBaseTargetBuilder(targetBuilderFn)
if err != nil {
dglogger.Errorf(ctx, "bind to struct error: %v", err)
return nil, err
}
return ts, nil
}
func BindExcel2Struct[T any](ctx *dgctx.DgContext, filePath string, headerRow int, dataStartRow int) ([]*T, error) {
file, err := os.Open(filePath)
if err != nil {
dglogger.Errorf(ctx, "open excel file error: %v", err)
return nil, err
}
defer func(f *os.File) {
err := f.Close()
if err != nil {
dglogger.Errorf(ctx, "close excel file error: %v", err)
}
}(file)
t := new(T)
p, err := newParser(t)
if err != nil {
dglogger.Errorf(ctx, "new parser error: %v", err)
return nil, err
}
rt, err := p.ParseContent(file, headerRow, dataStartRow)
if err != nil {
dglogger.Errorf(ctx, "parse content error: %v", err)
return nil, err
}
errList, has := rt.HasError()
if has {
var errs []string
for k, v := range errList {
dglogger.Warn(ctx, k, v)
egs := dgcoll.MapToList(v, func(s string) string { return fmt.Sprintf("第%d行:%s", k, s) })
errs = append(errs, egs...)
}
return nil, dgerr.SimpleDgError(strings.Join(errs, "\n"))
}
ts := make([]*T, 0)
err = rt.Format(&ts)
if err != nil {
dglogger.Errorf(ctx, "bind to struct error: %v", err)
return nil, err
}
return ts, nil
}
func ExportStruct2XlsxFile(ctx *dgctx.DgContext, v any, filePath string) error {
xlsx, err := ExportStruct2Xlsx(v)
if err != nil {
dglogger.Errorf(ctx, "export struct to xlsx file error: %v", err)
return err
}
err = xlsx.SaveAs(filePath)
if err != nil {
dglogger.Errorf(ctx, "save exported xlsx file error: %v", err)
return err
}
return nil
}