-
Notifications
You must be signed in to change notification settings - Fork 9
/
xlsx.go
98 lines (87 loc) · 2.28 KB
/
xlsx.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
package main
import (
"fmt"
"log"
"strconv"
"strings"
)
type xlsx struct {
Name string
FileName string
Template *xField
OwnTemplate *xField
Data []*xField
keymap map[int]*xField
ParentClass string
}
func (x *xlsx) Init(fileName string, name string) {
x.Name = name
x.FileName = fileName
x.Data = make([]*xField, 0)
x.keymap = make(map[int]*xField)
}
func (x *xlsx) Parse(rows [][]string) {
x.Template = new(xField)
x.OwnTemplate = x.Template.Copy()
if ok, _ := x.Template.Init(x.Name, "struct", ""); ok {
x.Template.ParseSubFieldsDefs(rows[1], rows[2], rows[3])
for i := 4; i < len(rows); i++ {
field := x.Template.Copy()
// comment row
if strings.HasPrefix(rows[i][0], "//") || rows[i][0] == "" {
continue
}
id, _ := strconv.Atoi(rows[i][0])
if _, ok2 := x.keymap[id]; !ok2 {
field.ParseDatas(id, rows[i])
field.SetLevel(4)
x.Data = append(x.Data, field)
x.keymap[id] = field
} else {
log.Fatalln("Parse", x.Name, "failed, Id", id, "is duplicated")
}
}
i := 0
for i < len(x.Template.Fields) {
v := x.Template.Fields[i]
if strings.HasPrefix(v.Type, "//") || (v.Tag != "" && v.Tag != params.tag) {
x.Template.Fields = append(x.Template.Fields[:i], x.Template.Fields[i+1:]...)
} else {
i++
}
}
if x.ParentClass != "" {
x.OwnTemplate.Fields = x.OwnTemplate.Fields[:0]
parentClassName := x.ParentClass + ".xlsx"
if val, ok := loadedFiles[parentClassName]; ok {
parseExcel(parentClassName, val)
} else {
log.Fatalln("Cant find parent class excel name = " + parentClassName)
}
for index := 0; index < len(x.Template.Fields); index++ {
field := x.Template.Fields[index]
if !loadedFiles[parentClassName].xl.CheckExistField(field) {
x.OwnTemplate.Fields = append(x.OwnTemplate.Fields, field.Copy())
}
}
} else {
x.OwnTemplate = x.Template.Copy()
}
} else {
log.Fatalln("Parse", x.Name, "head field")
}
}
func (x *xlsx) CheckExistField(field *xField) bool {
for index := 0; index < len(x.Template.Fields); index++ {
if x.Template.Fields[index].Name == field.Name && x.Template.Fields[index].LongType == field.LongType {
return true
}
}
return false
}
func (x *xlsx) Print() {
for k, v := range x.Data {
fmt.Print(k, " ")
v.Print()
}
}