-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathexcel.go
156 lines (137 loc) · 3.8 KB
/
excel.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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package main
import (
"fmt"
"strings"
"github.com/tealeg/xlsx/v3"
)
var HEADERS = []string{
"NIVEAU HABILITATION",
"ENTITES",
"ACCES GEOGRAPHIQUE",
"FONCTION",
"SEGMENT",
"PRENOM",
"NOM",
"ADRESSE MAIL",
"GOUP",
"SCOPE",
"BOARDS",
"TASKFORCE",
}
var NOM_PREMIERE_PAGE = "utilisateurs"
func splitExcelValue(value string, sep string) []string {
splitValue := strings.Split(value, sep)
trimmedValue := mapSlice(splitValue, strings.TrimSpace)
return selectSlice(trimmedValue, func(s string) bool { return s != "" })
}
func loadExcel(excelFileName string) (Users, map[string]Roles, error) {
xlFile, err := xlsx.OpenFile(excelFileName)
if err != nil {
return nil, nil, err
}
err = checkExcelFormat(xlFile)
if err != nil {
return nil, nil, err
}
var table [][]string
var zones [][]string
for _, sheet := range xlFile.Sheets {
if sheet.Name == NOM_PREMIERE_PAGE {
table = loadSheet(*sheet)
}
if sheet.Name == "zones" {
zones = loadSheet(*sheet)
}
}
users := make(Users)
fields := make(map[string]int)
for i, f := range table[0] {
fields[f] = i
}
zoneFields := make(map[string]int)
for i, f := range zones[0] {
zoneFields[f] = i
}
for _, userRow := range table[1:] {
niveau := userRow[fields["NIVEAU HABILITATION"]]
email := Username(strings.TrimSpace(strings.ToLower(userRow[fields["ADRESSE MAIL"]])))
if email != "" && len(userRow[fields["PRENOM"]]) > 1 {
user := User{
niveau: strings.ToLower(niveau),
email: email,
nom: strings.ToUpper(userRow[fields["NOM"]]),
prenom: strings.ToUpper(userRow[fields["PRENOM"]][0:1]) + strings.ToLower(userRow[fields["PRENOM"]][1:]),
segment: userRow[fields["SEGMENT"]],
fonction: userRow[fields["FONCTION"]],
employeur: userRow[fields["ENTITES"]],
goup: userRow[fields["GOUP"]],
accesGeographique: userRow[fields["ACCES GEOGRAPHIQUE"]],
scope: splitExcelValue(userRow[fields["SCOPE"]], ","),
boards: splitExcelValue(userRow[fields["BOARDS"]], ","),
taskforces: splitExcelValue(userRow[fields["TASKFORCE"]], ","),
}
users[email] = user
}
}
compositeRoles := make(map[string]Roles)
for _, z := range zones[1:] {
compositeRoles[z[zoneFields["REGION"]]] = append(
compositeRoles[z[zoneFields["REGION"]]],
z[zoneFields["DEPARTEMENT"]],
)
compositeRoles[z[zoneFields["ANCIENNE REGION"]]] = append(
compositeRoles[z[zoneFields["ANCIENNE REGION"]]],
z[zoneFields["DEPARTEMENT"]],
)
}
return users, compositeRoles, nil
}
func checkExcelFormat(file *xlsx.File) error {
return checkSheet1Format(file.Sheets[0])
}
func checkSheet1Format(sheet *xlsx.Sheet) error {
if sheet.Name != NOM_PREMIERE_PAGE {
return InvalidExcelFileError{msg: fmt.Sprintf("la première page n'a pas le bon nom (%s) : %s", NOM_PREMIERE_PAGE, sheet.Name)}
}
firstRow, err := sheet.Row(0)
if err != nil {
return InvalidExcelFileError{msg: "erreur lors de la récupération des headers", err: err}
}
for i := 0; i < len(HEADERS); i++ {
cell := firstRow.GetCell(i)
actual := cell.Value
expected := HEADERS[i]
if actual != expected {
return InvalidExcelFileError{
msg: fmt.Sprintf("l'entête %s en position %d ne correspond pas à la valeur attendue %s", actual, i, expected),
}
}
}
return nil
}
func loadSheet(sheet xlsx.Sheet) [][]string {
var r [][]string
_ = sheet.ForEachRow(func(row *xlsx.Row) error {
var line []string
_ = row.ForEachCell(func(cell *xlsx.Cell) error {
line = append(line, cell.Value)
return nil
})
if isNotEmpty(line) {
r = append(r, line)
}
return nil
})
return r
}
func isNotEmpty(array []string) bool {
if array == nil {
return false
}
for _, current := range array {
if current != "" {
return true
}
}
return false
}