List in list

The nesting specification of list in list.

Nested in vertical-list

Horizontal-list in vertical-list

A worksheet ItemConf in HelloWorld.xlsx:

IDNameProp1IDProp1ValueProp2IDProp2Value
[Item]uint32string[Prop]int32int64int32int64
Item’s IDItem’s nameProp1’s IDProp1’s valueProp2’s IDProp2’s value
1Apple110220
2Orange330
3Banana

Generated:

hello_world.proto
// --snip--
option (tableau.workbook) = {name:"HelloWorld.xlsx"};

message ItemConf {
  option (tableau.worksheet) = {name:"ItemConf" namerow:1 typerow:2 noterow:3 datarow:4};

  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": []
        }
    ]
}

Vertical-list in vertical-keyed-list

A worksheet ItemConf in HelloWorld.xlsx:

IDNamePropIDPropValue
[Item]<uint32>string[Prop]int32int64
Item’s IDItem’s nameProp’s IDProp’s value
1Apple110
2Orange120
2Banana230

Generated:

hello_world.proto
// --snip--
option (tableau.workbook) = {name:"HelloWorld.xlsx"};

message ItemConf {
  option (tableau.worksheet) = {name:"ItemConf" namerow:1 typerow:2 noterow:3 datarow:4};

  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"
                }
            ]
        }
    ]
}

Incell-list in vertical-keyed-list

A worksheet ItemConf in HelloWorld.xlsx:

IDProp
[Item]uint32[]int32
Item’s IDItem’s props
110,20,30
210,20
310

Generated:

hello_world.proto
// --snip--
option (tableau.workbook) = {name:"HelloWorld.xlsx"};

message ItemConf {
  option (tableau.worksheet) = {name:"ItemConf" namerow:1 typerow:2 noterow:3 datarow:4};

  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
            ]
        }
    ]
}

First-field in horizontal-list

Horizontal-list in horizontal-list

A worksheet ItemConf in HelloWorld.xlsx:

Reward1Item1IDReward1Item1NumReward1Item2IDReward1Item2NumReward1NameReward2Item1IDReward2Item1NumReward2Name
[Reward][Item]int32int32int32int32stringint32int32string
Item1’s IDItem1’s numItem2’s IDItem2’s numReward’s nameItem1’s IDItem1’s numReward’s name
110220Lotto10100Super Lotto

Generated:

hello_world.proto
// --snip--
option (tableau.workbook) = {name:"HelloWorld.xlsx"};

message ItemConf {
  option (tableau.worksheet) = {name:"ItemConf" namerow:1 typerow:2 noterow:3 datarow:4};

  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"
        }
    ]
}

Predefined-struct-list in horizontal-list

Item in common.proto is predefined as:

message Item {
    int32 id = 1 [(tableau.field) = {name:"ID"}];
    int32 num = 2 [(tableau.field) = {name:"Num"}];
}

A worksheet ItemConf in HelloWorld.xlsx:

Reward1Item1IDReward1Item1NumReward1Item2IDReward1Item2NumReward1NameReward2Item1IDReward2Item1NumReward2Name
[Reward][.Item]int32int32int32int32stringint32int32string
Item1’s IDItem1’s numItem2’s IDItem2’s numReward’s nameItem1’s IDItem1’s numReward’s name
110220Lotto10100Super Lotto

Generated:

hello_world.proto
// --snip--
import "common.proto";
option (tableau.workbook) = {name:"HelloWorld.xlsx"};

message ItemConf {
  option (tableau.worksheet) = {name:"ItemConf" namerow:1 typerow:2 noterow:3 datarow:4};

  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"
        }
    ]
}