List 嵌套 List
Excel list 中嵌套 list 的规范说明。
纵向 list 中的嵌套
纵向 list 中的横向 list
HelloWorld.xlsx 中的 worksheet ItemConf:
| ID | Name | Prop1ID | Prop1Value | Prop2ID | Prop2Value |
|---|---|---|---|---|---|
| [Item]uint32 | string | [Prop]int32 | int64 | int32 | int64 |
| Item’s ID | Item’s name | Prop1’s ID | Prop1’s value | Prop2’s ID | Prop2’s value |
| 1 | Apple | 1 | 10 | 2 | 20 |
| 2 | Orange | 3 | 30 | ||
| 3 | Banana |
生成结果:
hello_world.proto
// --snip--
option (tableau.workbook) = {name:"HelloWorld.xlsx" namerow:1 typerow:2 noterow:3 datarow:4};
message ItemConf {
option (tableau.worksheet) = {name:"ItemConf"};
repeated Item item_list = 1 [(tableau.field) = {layout:LAYOUT_VERTICAL}];
message Item {
uint32 id = 1 [(tableau.field) = {name:"ID"}];
string name = 2 [(tableau.field) = {name:"Name"}];
repeated Prop prop_list = 3 [(tableau.field) = {name:"Prop" layout:LAYOUT_HORIZONTAL}];
message Prop {
int32 id = 1 [(tableau.field) = {name:"ID"}];
int64 value = 2 [(tableau.field) = {name:"Value"}];
}
}
}
ItemConf.json
{
"itemList": [
{
"id": 1,
"name": "Apple",
"propList": [{"id": 1, "value": "10"}, {"id": 2, "value": "20"}]
},
{
"id": 2,
"name": "Orange",
"propList": [{"id": 3, "value": "30"}]
},
{
"id": 3,
"name": "Banana",
"propList": []
}
]
}
纵向 keyed-list 中的纵向 list
HelloWorld.xlsx 中的 worksheet ItemConf:
| ID | Name | PropID | PropValue |
|---|---|---|---|
| [Item]<uint32> | string | [Prop]int32 | int64 |
| Item’s ID | Item’s name | Prop’s ID | Prop’s value |
| 1 | Apple | 1 | 10 |
| 2 | Orange | 1 | 20 |
| 2 | Banana | 2 | 30 |
生成结果:
hello_world.proto
// --snip--
option (tableau.workbook) = {name:"HelloWorld.xlsx" namerow:1 typerow:2 noterow:3 datarow:4};
message ItemConf {
option (tableau.worksheet) = {name:"ItemConf"};
repeated Item item_list = 1 [(tableau.field) = {key:"ID" layout:LAYOUT_VERTICAL}];
message Item {
uint32 id = 1 [(tableau.field) = {name:"ID"}];
string name = 2 [(tableau.field) = {name:"Name"}];
repeated Prop prop_list = 3 [(tableau.field) = {layout:LAYOUT_VERTICAL}];
message Prop {
int32 prop_id = 1 [(tableau.field) = {name:"PropID"}];
int64 prop_value = 2 [(tableau.field) = {name:"PropValue"}];
}
}
}
ItemConf.json
{
"itemList": [
{
"id": 1,
"name": "Apple",
"propList": [{"propId": 1, "propValue": "10"}]
},
{
"id": 2,
"name": "Orange",
"propList": [{"propId": 1, "propValue": "20"}, {"propId": 2, "propValue": "30"}]
}
]
}
纵向 keyed-list 中的纵向 keyed-list
HelloWorld.xlsx 中的 worksheet ItemConf:
| ID | Desc | PropID | PropNum |
|---|---|---|---|
| [KeyedItem]<uint32> | string | [Prop]<uint32> | int32 |
| Item’s ID | Item’s desc | Prop’s ID | Prop’s num |
| 1 | Apple | 10 | 100 |
| 1 | Banana | 11 | 110 |
| 2 | Orange | 20 | 200 |
生成结果:
hello_world.proto
// --snip--
option (tableau.workbook) = {name:"HelloWorld.xlsx" namerow:1 typerow:2 noterow:3 datarow:4};
message ItemConf {
option (tableau.worksheet) = {name:"ItemConf"};
repeated KeyedItem keyed_item_list = 1 [(tableau.field) = {key:"ID" layout:LAYOUT_VERTICAL}];
message KeyedItem {
uint32 id = 1 [(tableau.field) = {name:"ID"}];
string desc = 2 [(tableau.field) = {name:"Desc"}];
repeated Prop prop_list = 3 [(tableau.field) = {key:"PropID" layout:LAYOUT_VERTICAL}];
message Prop {
uint32 prop_id = 1 [(tableau.field) = {name:"PropID"}];
int32 prop_num = 2 [(tableau.field) = {name:"PropNum"}];
}
}
}
ItemConf.json
{
"keyedItemList": [
{
"id": 1,
"desc": "Apple",
"propList": [{"propId": 10, "propNum": 100}, {"propId": 11, "propNum": 110}]
},
{
"id": 2,
"desc": "Orange",
"propList": [{"propId": 20, "propNum": 200}]
}
]
}
纵向 keyed-list 中的 incell list
HelloWorld.xlsx 中的 worksheet ItemConf:
| ID | Prop |
|---|---|
| [Item]uint32 | []int32 |
| Item’s ID | Item’s props |
| 1 | 10,20,30 |
| 2 | 10,20 |
| 3 | 10 |
生成结果:
hello_world.proto
// --snip--
option (tableau.workbook) = {name:"HelloWorld.xlsx" namerow:1 typerow:2 noterow:3 datarow:4};
message ItemConf {
option (tableau.worksheet) = {name:"ItemConf"};
repeated Item item_list = 1 [(tableau.field) = {layout:LAYOUT_VERTICAL}];
message Item {
uint32 id = 1 [(tableau.field) = {name:"ID"}];
repeated int32 prop_list = 2 [(tableau.field) = {name:"Prop" layout:LAYOUT_INCELL}];
}
}
ItemConf.json
{
"itemList": [
{"id": 1, "propList": [10, 20, 30]},
{"id": 2, "propList": [10, 20]},
{"id": 3, "propList": [10]}
]
}
纵向 keyed-list 中的 incell keyed-list
HelloWorld.xlsx 中的 worksheet ItemConf:
| ID | Desc | Tip |
|---|---|---|
| [KeyedItem]<uint32>|{unique:false} | string | []<uint32> |
| Item’s ID | Item’s desc | Item’s tip |
| 1 | Apple | 1,2,3 |
| 1 | Banana | 4,5 |
| 2 | Orange | 1,2 |
父级 struct keyed-list 需要聚合 incell keyed-list,因此需要将字段属性 unique 设置为 false。
生成结果:
hello_world.proto
// --snip--
option (tableau.workbook) = {name:"HelloWorld.xlsx" namerow:1 typerow:2 noterow:3 datarow:4};
message ItemConf {
option (tableau.worksheet) = {name:"ItemConf"};
repeated KeyedItem keyed_item_list = 1 [(tableau.field) = {key:"ID" layout:LAYOUT_VERTICAL}];
message KeyedItem {
uint32 id = 1 [(tableau.field) = {name:"ID" prop:{unique:false}}];
string desc = 2 [(tableau.field) = {name:"Desc"}];
repeated uint32 tip_list = 3 [(tableau.field) = {name:"Tip" key:"Tip" layout:LAYOUT_INCELL}];
}
}
ItemConf.json
{
"keyedItemList": [
{"id": 1, "desc": "Apple", "tipList": [1, 2, 3, 4, 5]},
{"id": 2, "desc": "Orange", "tipList": [1, 2]}
]
}
横向 list 中的嵌套
横向 list 中的横向 list
HelloWorld.xlsx 中的 worksheet ItemConf:
| Reward1Item1ID | Reward1Item1Num | Reward1Item2ID | Reward1Item2Num | Reward1Name | Reward2Item1ID | Reward2Item1Num | Reward2Name |
|---|---|---|---|---|---|---|---|
| [Reward][Item]int32 | int32 | int32 | int32 | string | int32 | int32 | string |
| Item1’s ID | Item1’s num | Item2’s ID | Item2’s num | Reward’s name | Item1’s ID | Item1’s num | Reward’s name |
| 1 | 10 | 2 | 20 | Lotto | 10 | 100 | Super Lotto |
生成结果:
hello_world.proto
// --snip--
option (tableau.workbook) = {name:"HelloWorld.xlsx" namerow:1 typerow:2 noterow:3 datarow:4};
message ItemConf {
option (tableau.worksheet) = {name:"ItemConf"};
repeated Reward reward_list = 1 [(tableau.field) = {name:"Reward" layout:LAYOUT_HORIZONTAL}];
message Reward {
repeated Item item_list = 1 [(tableau.field) = {name:"Item" layout:LAYOUT_HORIZONTAL}];
message Item {
int32 id = 1 [(tableau.field) = {name:"ID"}];
int32 num = 2 [(tableau.field) = {name:"Num"}];
}
string name = 2 [(tableau.field) = {name:"Name"}];
}
}
ItemConf.json
{
"rewardList": [
{"itemList": [{"id": 1, "num": 10}, {"id": 2, "num": 20}], "name": "Lotto"},
{"itemList": [{"id": 10, "num": 100}], "name": "Super Lotto"}
]
}
横向 list 中的 predefined struct list
common.proto 中预定义的 Item:
message Item {
int32 id = 1 [(tableau.field) = {name:"ID"}];
int32 num = 2 [(tableau.field) = {name:"Num"}];
}
HelloWorld.xlsx 中的 worksheet ItemConf:
| Reward1Item1ID | Reward1Item1Num | Reward1Item2ID | Reward1Item2Num | Reward1Name | Reward2Item1ID | Reward2Item1Num | Reward2Name |
|---|---|---|---|---|---|---|---|
| [Reward][.Item]int32 | int32 | int32 | int32 | string | int32 | int32 | string |
| Item1’s ID | Item1’s num | Item2’s ID | Item2’s num | Reward’s name | Item1’s ID | Item1’s num | Reward’s name |
| 1 | 10 | 2 | 20 | Lotto | 10 | 100 | Super Lotto |
生成结果:
hello_world.proto
// --snip--
import "common.proto";
option (tableau.workbook) = {name:"HelloWorld.xlsx" namerow:1 typerow:2 noterow:3 datarow:4};
message ItemConf {
option (tableau.worksheet) = {name:"ItemConf"};
repeated Reward reward_list = 1 [(tableau.field) = {name:"Reward" layout:LAYOUT_HORIZONTAL}];
message Reward {
repeated protoconf.Item item_list = 1 [(tableau.field) = {name:"Item" layout:LAYOUT_HORIZONTAL}];
string name = 2 [(tableau.field) = {name:"Name"}];
}
}
ItemConf.json
{
"rewardList": [
{"itemList": [{"id": 1, "num": 10}, {"id": 2, "num": 20}], "name": "Lotto"},
{"itemList": [{"id": 10, "num": 100}], "name": "Super Lotto"}
]
}
横向 list 中的 incell list
HelloWorld.xlsx 中的 worksheet ItemConf:
| Task1Param | Task2Param | Task3Param |
|---|---|---|
| [Task][]int32 | []int32 | []int32 |
| Task1 | Task2 | Task3 |
| 1,2 | 3,4 | 5,6,7 |
生成结果:
hello_world.proto
// --snip--
option (tableau.workbook) = {name:"HelloWorld.xlsx" namerow:1 typerow:2 noterow:3 datarow:4};
message ItemConf {
option (tableau.worksheet) = {name:"ItemConf"};
repeated Task task_list = 1 [(tableau.field) = {name:"Task" layout:LAYOUT_HORIZONTAL}];
message Task {
repeated int32 param_list = 1 [(tableau.field) = {name:"Param" layout:LAYOUT_INCELL}];
}
}
ItemConf.json
{
"taskList": [
{"paramList": [1, 2]},
{"paramList": [3, 4]},
{"paramList": [5, 6, 7]}
]
}