forked from davyxu/tabtoy
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdatatab.go
162 lines (111 loc) · 2.84 KB
/
datatab.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
157
158
159
160
161
162
package model
import (
"fmt"
"strings"
)
// 表格的完整数据,表头有屏蔽时,对应行值为空
type DataTable struct {
HeaderType string // 表名,Index表里定义的类型
OriginalHeaderType string // HeaderFields对应的ObjectType,KV表为TableField
FileName string
SheetName string
Rows []*DataRow // 0下标为表头数据
Headers []*HeaderField
}
// 模板用,排除表头的数据索引
func (self *DataTable) DataIndexs() (ret []int) {
ret = make([]int, len(self.Rows)-1)
for i := 0; i < len(self.Rows)-1; i++ {
ret[i] = i + 1
}
return
}
func (self *DataTable) String() string {
var sb strings.Builder
sb.WriteString("====DataTable====\n")
sb.WriteString(fmt.Sprintf("HeaderType: %s\n", self.HeaderType))
sb.WriteString(fmt.Sprintf("OriginalHeaderType: %s\n", self.OriginalHeaderType))
sb.WriteString(fmt.Sprintf("FileName: %s\n", self.FileName))
sb.WriteString(fmt.Sprintf("SheetName: %s\n", self.SheetName))
// 遍历所有行
for row, rowData := range self.Rows {
sb.WriteString(fmt.Sprintf("%d ", row))
// 遍历一行中的所有列值
for index, cell := range rowData.Cells() {
if index > 0 {
sb.WriteString("/")
}
sb.WriteString(cell.Value)
}
sb.WriteString("\n")
}
return sb.String()
}
func (self *DataTable) MustGetHeader(col int) (header *HeaderField) {
for len(self.Headers) <= col {
self.Headers = append(self.Headers, &HeaderField{
Cell: &Cell{
Col: len(self.Headers),
},
})
}
return self.HeaderByColumn(col)
}
func (self *DataTable) HeaderByColumn(col int) *HeaderField {
return self.Headers[col]
}
func (self *DataTable) HeaderByName(name string) *HeaderField {
for _, header := range self.Headers {
if header.TypeInfo == nil {
continue
}
if header.TypeInfo.Name == name || header.TypeInfo.FieldName == name {
return header
}
}
return nil
}
func (self *DataTable) AddRow() (row int) {
row = len(self.Rows)
self.Rows = append(self.Rows, newDataRow(row, self))
return
}
func (self *DataTable) AddCell(row int) *Cell {
if row >= len(self.Rows) {
return nil
}
rowData := self.Rows[row]
return rowData.AddCell()
}
func (self *DataTable) MustGetCell(row, col int) *Cell {
for len(self.Rows) <= row {
self.AddRow()
}
rowData := self.Rows[row]
for len(rowData.cells) <= col {
rowData.AddCell()
}
return rowData.Cell(col)
}
// 代码生成专用
func (self *DataTable) GetCell(row, col int) *Cell {
if row >= len(self.Rows) {
return nil
}
rowData := self.Rows[row]
if col >= len(rowData.cells) {
return nil
}
return rowData.Cell(col)
}
// 根据列头找到该行对应的值
func (self *DataTable) GetValueByName(row int, name string) *Cell {
header := self.HeaderByName(name)
if header == nil {
return nil
}
return self.GetCell(row, header.Cell.Col)
}
func NewDataTable() *DataTable {
return &DataTable{}
}