Enum(枚举)

本文说明 Excel enum 类型的各种特性。

使用预定义枚举类型

枚举基础知识请参考 Enum(枚举)→

例如,common.proto 中定义的枚举类型 FruitType

enum FruitType {
  FRUIT_TYPE_UNKNOWN = 0 [(tableau.evalue).name = "Unknown"];
  FRUIT_TYPE_APPLE   = 1 [(tableau.evalue).name = "Apple"];
  FRUIT_TYPE_ORANGE  = 2 [(tableau.evalue).name = "Orange"];
  FRUIT_TYPE_BANANA  = 4 [(tableau.evalue).name = "Banana"];
}

HelloWorld.xlsx 中的 worksheet ItemConf

IDType
map<uint32, Item>enum<.FruitType>
Item’s IDFruit’s type
11
2Orange
3FRUIT_TYPE_BANANA

生成结果:

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

  map<uint32, Item> item_map = 1 [(tableau.field) = {key:"ID" layout:LAYOUT_VERTICAL}];
  message Item {
    uint32 id = 1 [(tableau.field) = {name:"ID"}];
    FruitType type = 2 [(tableau.field) = {name:"Type"}];
  }
}
ItemConf.json
{
    "itemMap":  {
        "1":  {"id":  1, "type":  "FRUIT_TYPE_APPLE"},
        "2":  {"id":  3, "type":  "FRUIT_TYPE_ORANGE"},
        "3":  {"id":  2, "type":  "FRUIT_TYPE_BANANA"}
    }
}

在 sheet 中定义枚举类型

在 metasheet @TABLEAU 中有两种 Mode 可用于在 sheet 中定义枚举类型:

  • MODE_ENUM_TYPE:在一个 sheet 中定义单个枚举类型。
  • MODE_ENUM_TYPE_MULTI:在一个 sheet 中定义多个枚举类型。

单个枚举类型

需要在 metasheet @TABLEAU 中将 Mode 选项设置为 MODE_ENUM_TYPE

例如,HelloWorld.xlsx 中的 worksheet ItemType

NameAlias
ITEM_TYPE_FRUITFruit
ITEM_TYPE_EQUIPEquip
ITEM_TYPE_BOXBox
SheetMode
ItemTypeMODE_ENUM_TYPE

生成结果:

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

// Generated from sheet: ItemType.
enum ItemType {
  ITEM_TYPE_INVALID = 0;
  ITEM_TYPE_FRUIT = 1 [(tableau.evalue).name = "Fruit"];
  ITEM_TYPE_EQUIP = 2 [(tableau.evalue).name = "Equip"];
  ITEM_TYPE_BOX = 3 [(tableau.evalue).name = "Box"];
}

多个枚举类型

一个 block 定义一个枚举类型,由一系列连续的非空行组成。 不同的 block 之间由一行或多行空行分隔。

需要在 metasheet @TABLEAU 中将 Mode 选项设置为 MODE_ENUM_TYPE_MULTI

例如,HelloWorld.xlsx 中的 worksheet ItemType

CatTypeCatType note
NumberNameAlias
1CAT_TYPE_RAGDOLLRagdoll
2CAT_TYPE_PERSIANPersian
3CAT_TYPE_SPHYNXSphynx
DogTypeDogType note
NumberNameAlias
1DOG_TYPE_POODLEPoodle
2DOG_TYPE_BULLDOGBulldog
3DOG_TYPE_DACHSHUNDDachshund
BirdTypeBirdType note
NumberNameAlias
1CANARYCanary
2WOODPECKERWoodpecker
3OWLOwl
SheetMode
ItemTypeMODE_ENUM_TYPE_MULTI

生成结果:

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

// CatType note
enum CatType {
  option (tableau.etype) = {name:"EnumType" note:"CatType note"};

  CAT_TYPE_INVALID = 0;
  CAT_TYPE_RAGDOLL = 1 [(tableau.evalue).name = "Ragdoll"];
  CAT_TYPE_PERSIAN = 2 [(tableau.evalue).name = "Persian"];
  CAT_TYPE_SPHYNX = 3 [(tableau.evalue).name = "Sphynx"];
}

// DogType note
enum DogType {
  option (tableau.etype) = {name:"EnumType" note:"DogType note"};

  DOG_TYPE_INVALID = 0;
  DOG_TYPE_POODLE = 1 [(tableau.evalue).name = "Poodle"];
  DOG_TYPE_BULLDOG = 2 [(tableau.evalue).name = "Bulldog"];
  DOG_TYPE_DACHSHUND = 3 [(tableau.evalue).name = "Dachshund"];
}

// BirdType note
enum BirdType {
  option (tableau.etype) = {name:"EnumType" note:"BirdType note"};

  BIRD_TYPE_INVALID = 0;
  BIRD_TYPE_CANARY = 1 [(tableau.evalue).name = "Canary"];
  BIRD_TYPE_WOODPECKER = 2 [(tableau.evalue).name = "Woodpecker"];
  BIRD_TYPE_OWL = 3 [(tableau.evalue).name = "Owl"];
}

指定 Number 列

Number 列中,可以指定自定义的唯一枚举值编号。

例如,HelloWorld.xlsx 中的 worksheet ItemType

NumberNameAlias
0ITEM_TYPE_UNKNOWNUnknown
10ITEM_TYPE_FRUITFruit
20ITEM_TYPE_EQUIPEquip
30ITEM_TYPE_BOXBox
SheetMode
ItemTypeMODE_ENUM_TYPE

生成结果:

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

// Generated from sheet: ItemType.
enum ItemType {
  ITEM_TYPE_UNKNOWN = 0 [(tableau.evalue).name = "Unknown"];
  ITEM_TYPE_FRUIT = 10 [(tableau.evalue).name = "Fruit"];
  ITEM_TYPE_EQUIP = 20 [(tableau.evalue).name = "Equip"];
  ITEM_TYPE_BOX = 30 [(tableau.evalue).name = "Box"];
}

在 sheet 中定义并使用枚举类型

例如,HelloWorld.xlsx 中的两个 worksheet ItemTypeItemConf

NumberNameAlias
1ITEM_TYPE_FRUITFruit
2ITEM_TYPE_EQUIPEquip
3ITEM_TYPE_BOXBox
IDTypeNamePrice
map<int32, Item>enum<.ItemType>stringint32
Item’s IDItem’s typeItem’s nameItem’s price
1FruitApple40
2FruitOrange20
3EquipSword10
SheetMode
ItemTypeMODE_ENUM_TYPE
ItemConf

生成结果:

hello_world.proto
// --snip--
import "common.proto";
option (tableau.workbook) = {name:"HelloWorld.xlsx" namerow:1 typerow:2 noterow:3 datarow:4};

// Generated from sheet: ItemType.
enum ItemType {
  ITEM_TYPE_INVALID = 0;
  ITEM_TYPE_FRUIT = 1 [(tableau.evalue).name = "Fruit"];
  ITEM_TYPE_EQUIP = 2 [(tableau.evalue).name = "Equip"];
  ITEM_TYPE_BOX = 3 [(tableau.evalue).name = "Box"];
}

message ItemConf {
  option (tableau.worksheet) = {name:"ItemConf"};

  map<int32, Item> item_map = 1 [(tableau.field) = {key:"ID" layout:LAYOUT_VERTICAL}];
  message Item {
    int32 id = 1 [(tableau.field) = {name:"ID"}];
    protoconf.ItemType type = 2 [(tableau.field) = {name:"Type"}];
    string name = 3 [(tableau.field) = {name:"Name"}];
    int32 price = 4 [(tableau.field) = {name:"Price"}];
  }
}
ItemConf.json
{
    "itemMap": {
        "1": {"id": 1, "type": "ITEM_TYPE_FRUIT", "name": "Apple", "price": 40},
        "2": {"id": 2, "type": "ITEM_TYPE_FRUIT", "name": "Orange", "price": 20},
        "3": {"id": 3, "type": "ITEM_TYPE_EQUIP", "name": "Sword", "price": 10}
    }
}