Skip to content

Commit 43fe585

Browse files
committed
添加error处理
1 parent 6398b78 commit 43fe585

40 files changed

+347
-163
lines changed

README_v3.md

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# tabtoy
2+
3+
4+
5+
# 流程
6+
并发读取电子表格及缓存
7+
8+
内建Type表读取
9+
内建Data表读取
10+
11+
Index表导入
12+
Type表导入
13+
Data表导入
14+
15+
Data表 数组表头 合并
16+
17+
18+
KV表转Data表
19+
20+
键值优化压缩
21+
22+
json导出
23+
go源码导出
24+
25+
# 检查
26+
27+
28+
# TODO
29+
30+
数组的处理: 单元格空时,无论任何情况,导出数组中都没有数值和0填充,除非添加一个特性:强制填充默认值,数组通过多个单元格导出时,默认值为单元格数量
31+
32+
做成SDK,无需导出数据,开发期直接读取电子表格
33+
34+
KV键值表合理的换行

util/rc2a.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,6 @@ func index2Alphabet(number int) string {
6767
}
6868

6969
// r,c都是base1
70-
func ConvR1C1toA1(r, c int) string {
70+
func R1C1ToA1(r, c int) string {
7171
return fmt.Sprintf("%s%d", index2Alphabet(c), r)
7272
}

v2/datamerge.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ ErrorStop:
9595
return false
9696
}
9797

98-
log.Errorf("%s|%s(%s)", currFV.FileName, currFV.SheetName, util.ConvR1C1toA1(currFV.R, currFV.C))
98+
log.Errorf("%s|%s(%s)", currFV.FileName, currFV.SheetName, util.R1C1ToA1(currFV.R, currFV.C))
9999
return false
100100

101101
}

v2/printer/globals.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ func (self *Globals) AddTypes(localFD *model.FileDescriptor) bool {
100100
self.Pragma.SetString("Package", localFD.Pragma.GetString("Package"))
101101
} else if self.Pragma.GetString("Package") != localFD.Pragma.GetString("Package") {
102102

103-
log.Errorf("%s, '%s' '%s'", i18n.String(i18n.Globals_PackageNameDiff), localFD.Pragma.GetString("TableName"), self.Pragma.GetString("TableName"))
103+
log.Errorf("%s, '%s' '%s'", i18n.String(i18n.Globals_PackageNameDiff), localFD.Pragma.GetString("TableName"), self.Pragma.GetString("TableType"))
104104
return false
105105
}
106106

v2/sheet_data.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ func (self *DataSheet) exportRowMajor(file *File, dataModel *model.DataModel, da
7171
if meetEmptyLine && !warningAfterEmptyLineDataOnce {
7272
r, _ := self.GetRC()
7373

74-
log.Warnf("%s %s|%s(%s)", i18n.String(i18n.DataSheet_RowDataSplitedByEmptyLine), self.file.FileName, self.Name, util.ConvR1C1toA1(r, 1))
74+
log.Warnf("%s %s|%s(%s)", i18n.String(i18n.DataSheet_RowDataSplitedByEmptyLine), self.file.FileName, self.Name, util.R1C1ToA1(r, 1))
7575

7676
warningAfterEmptyLineDataOnce = true
7777
}
@@ -91,7 +91,7 @@ func (self *DataSheet) exportRowMajor(file *File, dataModel *model.DataModel, da
9191
fieldDef, ok := fieldDefGetter(self.Column, dataHeader, parentHeader)
9292

9393
if !ok {
94-
log.Errorf("%s %s|%s(%s)", i18n.String(i18n.DataHeader_FieldNotDefinedInMainTableInMultiTableMode), self.file.FileName, self.Name, util.ConvR1C1toA1(self.Row+1, self.Column+1))
94+
log.Errorf("%s %s|%s(%s)", i18n.String(i18n.DataHeader_FieldNotDefinedInMainTableInMultiTableMode), self.file.FileName, self.Name, util.R1C1ToA1(self.Row+1, self.Column+1))
9595
return false
9696
}
9797

v2/sheet_dataheader.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ ErrorStop:
106106

107107
r, c := sheet.GetRC()
108108

109-
log.Errorf("%s|%s(%s)", sheet.file.FileName, sheet.Name, util.ConvR1C1toA1(r, c))
109+
log.Errorf("%s|%s(%s)", sheet.file.FileName, sheet.Name, util.R1C1ToA1(r, c))
110110
return false
111111
}
112112

v2/sheet_datav.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ func (self *DataSheet) exportColumnMajor(file *File, dataModel *model.DataModel,
4545
if meetEmptyLine && !warningAfterEmptyLineDataOnce {
4646
r, _ := self.GetRC()
4747

48-
log.Warnf("%s %s|%s(%s)", i18n.String(i18n.DataSheet_RowDataSplitedByEmptyLine), self.file.FileName, self.Name, util.ConvR1C1toA1(r, 1))
48+
log.Warnf("%s %s|%s(%s)", i18n.String(i18n.DataSheet_RowDataSplitedByEmptyLine), self.file.FileName, self.Name, util.R1C1ToA1(r, 1))
4949

5050
warningAfterEmptyLineDataOnce = true
5151
}

v2/sheet_type.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ func (self *TypeSheet) parseTable(root *typeModelRoot) bool {
8484

8585
//已经碰过空行, 这里又碰到数据, 说明有人为隔出的空行, 做warning提醒, 防止数据没导出
8686
if meetEmptyLine && !warningAfterEmptyLineDataOnce {
87-
log.Errorf("%s %s|%s(%s)", i18n.String(i18n.TypeSheet_RowDataSplitedByEmptyLine), self.file.FileName, self.Name, util.ConvR1C1toA1(row, 1))
87+
log.Errorf("%s %s|%s(%s)", i18n.String(i18n.TypeSheet_RowDataSplitedByEmptyLine), self.file.FileName, self.Name, util.R1C1ToA1(row, 1))
8888

8989
warningAfterEmptyLineDataOnce = true
9090
}
@@ -164,7 +164,7 @@ ErrorStop:
164164

165165
r, c := self.GetRC()
166166

167-
log.Errorf("%s|%s(%s)", self.file.FileName, self.Name, util.ConvR1C1toA1(r, c))
167+
log.Errorf("%s|%s(%s)", self.file.FileName, self.Name, util.R1C1ToA1(r, c))
168168
return false
169169
}
170170

v3/checker/TODO.md

-9
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,8 @@
66

77
- 类型找不到
88

9-
10-
类型表可以+ 数据表也可以+
11-
12-
数据缩减,json 二进制, 动态生成类型,用json default value 来实现?
13-
149
数组里每一个类型匹配原始类型
1510

1611
枚举值重复,没填
1712

1813

19-
数组的处理: 单元格空时,无论任何情况,导出数组中都没有数值和0填充,除非添加一个特性:强制填充默认值,数组通过多个单元格导出时,默认值为单元格数量
20-
21-
22-
做成SDK,无需导出数据,开发期直接读取电子表格

v3/entry.go

+25-11
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,40 @@
11
package v3
22

33
import (
4+
"github.com/davyxu/tabtoy/v3/helper"
45
"github.com/davyxu/tabtoy/v3/model"
56
"github.com/davyxu/tabtoy/v3/table"
67
)
78

89
func Parse(globals *model.Globals) error {
910

11+
defer func() {
12+
13+
switch err := recover().(type) {
14+
case *helper.ErrorObject:
15+
log.Errorf("%s", err.Error())
16+
case nil:
17+
default:
18+
panic(err)
19+
}
20+
21+
}()
22+
1023
// TODO 更好的内建读取
11-
err := loadSymbols(globals, globals.BuiltinSymbolFile)
24+
err := LoadSymbols(globals, globals.BuiltinSymbolFile)
1225

1326
if err != nil {
1427
return err
1528
}
1629

1730
var kvlist model.DataTableList
1831

19-
LoadIndex(globals, globals.IndexFile, func(pragma *table.TablePragma) error {
32+
LoadIndex(globals, globals.IndexFile)
2033

21-
switch pragma.TableType {
22-
case table.TableType_Data:
34+
for _, pragma := range globals.IndexList {
35+
36+
switch pragma.TableMode {
37+
case table.TableMode_Data:
2338

2439
tabName := getTableName(pragma)
2540

@@ -28,6 +43,7 @@ func Parse(globals *model.Globals) error {
2843
if dataTable == nil {
2944
dataTable = model.NewDataTable()
3045
dataTable.Name = tabName
46+
dataTable.FileName = pragma.TableFileName
3147
globals.AddDataTable(dataTable)
3248
}
3349

@@ -37,14 +53,14 @@ func Parse(globals *model.Globals) error {
3753
return err
3854
}
3955

40-
case table.TableType_Symbol:
56+
case table.TableMode_Type:
4157

42-
err = loadSymbols(globals, pragma.TableFileName)
58+
err = LoadSymbols(globals, pragma.TableFileName)
4359

4460
if err != nil {
4561
return err
4662
}
47-
case table.TableType_KeyValue:
63+
case table.TableMode_KeyValue:
4864

4965
tabName := getTableName(pragma)
5066

@@ -53,6 +69,7 @@ func Parse(globals *model.Globals) error {
5369
if kvtab == nil {
5470
kvtab = model.NewDataTable()
5571
kvtab.Name = tabName
72+
kvtab.FileName = pragma.TableFileName
5673
kvlist.AddDataTable(kvtab)
5774
}
5875

@@ -61,11 +78,8 @@ func Parse(globals *model.Globals) error {
6178
if err != nil {
6279
return err
6380
}
64-
6581
}
66-
67-
return nil
68-
})
82+
}
6983

7084
// kv转置
7185
for _, kvtab := range kvlist.Data {

v3/example/Data.xlsx

-41.4 KB
Binary file not shown.

v3/example/Data2.xlsx

-41.4 KB
Binary file not shown.

v3/example/Index.xlsx

-10 Bytes
Binary file not shown.

v3/example/KV.xlsx

-57 Bytes
Binary file not shown.

v3/example/KV2.xlsx

-82 Bytes
Binary file not shown.

v3/example/Type.xlsx

-34 Bytes
Binary file not shown.

v3/example/golang_gen.go

+19-14
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,26 @@
44
package example
55

66

7-
type TableType int32
7+
type TableMode int32
88
const (
9-
TableType_None = 0 //
10-
TableType_Data = 1 // 数据表
11-
TableType_Symbol = 2 // 类型表
12-
TableType_KeyValue = 3 // 键值表
9+
TableMode_None = 0 //
10+
TableMode_Data = 1 // 数据表
11+
TableMode_Type = 2 // 类型表
12+
TableMode_KeyValue = 3 // 键值表
1313
)
1414

1515
var (
16-
TableTypeMapperValueByName = map[string]int32{
16+
TableModeMapperValueByName = map[string]int32{
1717
"None": 0, //
1818
"Data": 1, // 数据表
19-
"Symbol": 2, // 类型表
19+
"Type": 2, // 类型表
2020
"KeyValue": 3, // 键值表
2121
}
2222

23-
TableTypeMapperNameByValue = map[int32]string{
23+
TableModeMapperNameByValue = map[int32]string{
2424
0: "None", //
2525
1: "Data", // 数据表
26-
2: "Symbol", // 类型表
26+
2: "Type", // 类型表
2727
3: "KeyValue", // 键值表
2828
}
2929
)
@@ -64,8 +64,7 @@ type TableField struct{
6464
FieldName string `tb_name:"字段名"`
6565
FieldType string `tb_name:"字段类型"`
6666
Value string `tb_name:"值"`
67-
IsArray bool `tb_name:"数组"`
68-
Splitter string `tb_name:"切割符"`
67+
ArraySplitter string `tb_name:"数组切割"`
6968
}
7069

7170
type FieldType struct{
@@ -76,10 +75,9 @@ type FieldType struct{
7675
}
7776

7877
type TablePragma struct{
79-
TableType TableType `tb_name:"表类型"`
80-
TableName string `tb_name:"表名"`
78+
TableMode TableMode `tb_name:"模式"`
79+
TableType string `tb_name:"表类型"`
8180
TableFileName string `tb_name:"表文件名"`
82-
IsVertical bool `tb_name:"垂直表"`
8381
}
8482

8583
type ExampleData struct{
@@ -102,3 +100,10 @@ type Config struct {
102100
ExampleData []*ExampleData // table: ExampleData
103101
ExampleKV []*ExampleKV // table: ExampleKV
104102
}
103+
104+
// table: ExampleKV
105+
func (self*Config) GetKeyValue_ExampleKV() *ExampleKV{
106+
return self.ExampleKV[0]
107+
}
108+
109+

v3/gen/gosrc/func.go

+13-8
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,21 @@ func init() {
1414

1515
var sb strings.Builder
1616

17-
sb.WriteString("`")
17+
var kv []string
1818

19-
sb.WriteString(fmt.Sprintf("tb_name:\"%s\"", fieldType.Name))
20-
//
21-
//if fieldType.Splitter != "" {
22-
// sb.WriteString(" ")
23-
// sb.WriteString(fmt.Sprintf("tb_splitter:\"%s\"", fieldType.Splitter))
24-
//}
19+
if fieldType.Name != "" {
20+
kv = append(kv, fmt.Sprintf("tb_name:\"%s\"", fieldType.Name))
21+
}
2522

26-
sb.WriteString("`")
23+
if len(kv) > 0 {
24+
sb.WriteString("`")
25+
26+
for _, s := range kv {
27+
sb.WriteString(s)
28+
}
29+
30+
sb.WriteString("`")
31+
}
2732

2833
return sb.String()
2934
}

v3/gen/gosrc/text.go

+7
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,11 @@ type {{$objName}} struct{ {{range $fi,$field := $.Symbols.Fields $objName}}
3333
type {{.CombineStructName}} struct { {{range $ti, $tab := $.Data}}
3434
{{$tab.Name}} []*{{$tab.Name}} // table: {{$tab.Name}} {{end}}
3535
}
36+
37+
//{{range $ti, $name := $.KeyValueTypeNames}} table: {{$name}}
38+
func (self*{{$.CombineStructName}}) GetKeyValue_{{$name}}() *{{$name}}{
39+
return self.{{$name}}[0]
40+
}
41+
{{end}}
42+
3643
`

v3/gen/json/func.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,14 @@ func wrapSingleValue(globals *model.Globals, valueType *table.TableField, value
3737
}
3838

3939
func WrapValue(globals *model.Globals, value string, valueType *table.TableField) string {
40-
if valueType.IsArray && valueType.Splitter != "" {
40+
if valueType.IsArray() {
4141

4242
var sb strings.Builder
4343
sb.WriteString("[")
4444

4545
// 空的单元格,导出空数组,除非强制指定填充默认值
4646
if value != "" {
47-
for index, elementValue := range strings.Split(value, valueType.Splitter) {
47+
for index, elementValue := range strings.Split(value, valueType.ArraySplitter) {
4848
if index > 0 {
4949
sb.WriteString(",")
5050
}

v3/header.go

+8-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package v3
22

33
import (
4-
"github.com/davyxu/tabtoy/util"
4+
"github.com/davyxu/tabtoy/v3/helper"
55
"github.com/davyxu/tabtoy/v3/model"
66
"github.com/tealeg/xlsx"
77
)
@@ -11,13 +11,17 @@ func loadheader(sheet *xlsx.Sheet, tab *model.DataTable) {
1111
var headerRow model.DataRow
1212
for col := 0; ; col++ {
1313

14-
header := util.GetSheetValueString(sheet, 0, col)
14+
header := helper.GetSheetValueString(sheet, 0, col)
1515

1616
// 空列,终止
1717
if header == "" {
1818
break
1919
}
2020

21+
//if headerRow.Exists(header) {
22+
// panic("Duplicate header value")
23+
//}
24+
2125
headerRow = append(headerRow, header)
2226
}
2327

@@ -26,11 +30,11 @@ func loadheader(sheet *xlsx.Sheet, tab *model.DataTable) {
2630

2731
func ResolveHeaderFields(tab *model.DataTable, tableObjectType string, symbols *model.SymbolTable) {
2832

29-
for _, value := range tab.RawHeader {
33+
for col, value := range tab.RawHeader {
3034

3135
tf := symbols.FindField(tableObjectType, value)
3236
if tf == nil {
33-
panic("type not found: " + value)
37+
helper.ReportError("HeaderFieldNotDefined", value, helper.Location(tab.FileName, 0, col))
3438
}
3539

3640
tab.AddHeaderField(tf)

0 commit comments

Comments
 (0)