{"id":15029343,"url":"https://github.com/davyxu/tabtoy","last_synced_at":"2025-05-15T04:05:37.851Z","repository":{"id":40244186,"uuid":"50093237","full_name":"davyxu/tabtoy","owner":"davyxu","description":"高性能表格数据导出器","archived":false,"fork":false,"pushed_at":"2024-06-19T07:28:09.000Z","size":19314,"stargazers_count":1801,"open_issues_count":29,"forks_count":425,"subscribers_count":76,"default_branch":"master","last_synced_at":"2025-04-11T14:21:06.715Z","etag":null,"topics":["csharp","csv","excel","exportor","fast","game","golang","json","lua","tool","xlsx"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/davyxu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-01-21T08:28:18.000Z","updated_at":"2025-04-09T14:24:59.000Z","dependencies_parsed_at":"2024-06-18T13:40:50.399Z","dependency_job_id":"cb007f01-47a9-40b9-a011-5b780d511a89","html_url":"https://github.com/davyxu/tabtoy","commit_stats":{"total_commits":338,"total_committers":10,"mean_commits":33.8,"dds":"0.041420118343195256","last_synced_commit":"315228cb2be00c487d696d1695572531b33a2772"},"previous_names":[],"tags_count":28,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davyxu%2Ftabtoy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davyxu%2Ftabtoy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davyxu%2Ftabtoy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davyxu%2Ftabtoy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/davyxu","download_url":"https://codeload.github.com/davyxu/tabtoy/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254270645,"owners_count":22042859,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csharp","csv","excel","exportor","fast","game","golang","json","lua","tool","xlsx"],"created_at":"2024-09-24T20:10:21.918Z","updated_at":"2025-05-15T04:05:32.839Z","avatar_url":"https://github.com/davyxu.png","language":"Go","funding_links":[],"categories":["Go"],"sub_categories":[],"readme":"# tabtoy v3\n\n高性能表格数据导出工具\n\n![tabtoylogo](doc/logo.png)\n\n# 特性\n* 支持Xlsx/CSV作为表格数据混合输入\n\n* 支持JSON/Golang/C#/Java/Lua/二进制 源码, 数据, 类型输出\n\n* 自动单元格数据格式检查, 精确到单元格的报错\n\n* 支持预定义枚举, 可使用中文枚举类型\n\n* 支持表拆分, 支持多人协作\n\n* 支持KV配置表, 方便将表格作为配置文件\n\n* 多核并发导出, 缓存加速, 上百文件秒级导出\n\n# 迭代历程\n\n* 2020年6月: tabtoy v3\n    支持Xlsx/CSV混合导出\n    \n    新的表格格式\n        \n    重构代码\n\n* 2016年8月: 第六代导出器,tabtoy v2 调整为以电子表格为中心的方式, 支持v1 90%常用功能\n\n\t增加: 所有导出文件均为1个文件, 提高加载读取速度\n\n\t增加: 二进制合并导出(第五代导出器需要使用2个工具才能完成)\n\t\n\t增加: C#源码导出及索引创建,无需protobuf支持\n\t\n\t增加: proto格式导出, 支持v2,v3格式\n\t\t\n\t重构代码, 导出速度更快\n\n* 2016年3月: 第五代导出器,tabtoy v1 在四代基础上重构,开源,支持并发导出\t\n\n* 2015年: 第四代导出器,基于Golang导出器,增加ID重复检查,数组格的多重写法, 支持a.b.c栏位导出, 导出速度大大提高\n\n* 2013年: 第三代导出器,在二代基础上做到内容格式与导出器独立,但依然依赖csv前置导出,增加逗号分隔格子内容,导出速度慢\n\n* 2012年: 第二代导出器,基于C++和Protobuf的导出器,内容格式与导出器混合编写,需要vbs导出csv,速度慢\n\t\n* 2011年: 第一代导出器,基于VBA的表格内建导出器,速度慢,复用困难,容易错,不安全\n\n# 导出第一个表\n\n## 类型表\n准备一个电子表格命名为: Type.xlsx\n\n类型表用于定义表格中表头以及用到的类型\n\n表格内容如下:\n\n种类 | 对象类型 | 标识名 | 字段名 | 字段类型 | 数组切割| 值 | 索引 | 标记\n---|---|---|---|---|---|---|---|---\n表头 | MyData | ID | ID | int32| \n表头 | MyData | 名称 | Name | string|\n\n## 数据表\n准备一个电子表格命名为: MyData.xlsx\n\n表格内容如下:\n\nID | 名称\n---|---\n1 | 坦克\n2 | 法师\n\n## 索引表\n* 准备一个电子表格命名为: Index.xlsx\n\n模式 | 表类型 | 表文件名\n---|---|---\n类型表 |        | Type.xlsx\n数据表 | MyData | MyData.xlsx\n\n注意 数据表的表类型需要与类型表里的对象类型对应\n\n## 编写导出shell\n\n\n[下载tabtoy](https://github.com/davyxu/tabtoy/releases)\n\n```bash\ntabtoy.exe -mode=v3 -index=Index.xlsx -json_out=table_gen.json\n```\n\n[完整例子文件](https://github.com/davyxu/tabtoy/tree/master/v3/example/tutorial)\n\n# 导出数据/源码/类型\n\n## Golang使用表格导出的JSON数据\n\n导出命令行:\n```bash\ntabtoy.exe -mode=v3 -index=Index.xlsx -package=main -go_out=table_gen.go -json_out=table_gen.json\n```\n\n读取数据源码:\n\n```go\n\tvar Tab = NewTable()\n\n\t// 表加载前清除之前的手动索引和表关联数据\n\tTab.RegisterPreEntry(func(tab *Table) error {\n\t\tfmt.Println(\"tab pre load clear\")\n\t\treturn nil\n\t})\n\n\t// 表加载和构建索引后，需要手动处理数据的回调\n\tTab.RegisterPostEntry(func(tab *Table) error {\n\t\tfmt.Println(\"tab post load done\")\n\t\tfmt.Printf(\"%+v\\n\", tab.ExampleDataByID[200])\n\n\t\tfmt.Println(\"KV: \", tab.GetKeyValue_ExampleKV().ServerIP)\n\t\treturn nil\n\t})\n\n\terr := tabtoy.LoadFromFile(Tab, \"../json/table_gen.json\")\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\tos.Exit(1)\n\t}\n```\n[完整Golang例子](https://github.com/davyxu/tabtoy/tree/master/v3/example/golang)\n\n## C#使用表格导出二进制数据\n\n导出命令行:\n```bash\ntabtoy.exe -mode=v3 -index=Index.xlsx -package=main -csharp_out=table_gen.cs -binary_out=table_gen.bin\n   ```\n\n读取数据源码:\n\n```cs\nusing (var stream = new FileStream(\"../../../../binary/table_gen.bin\", FileMode.Open))\n{\n    stream.Position = 0;\n\n    var reader = new tabtoy.TableReader(stream);\n\n\n    var tab = new main.Table();\n\n    try\n    {\n        tab.Deserialize(reader);\n    }\n    catch (Exception e)\n    {\n        Console.WriteLine(e);\n        throw;\n    }\n    \n    // 建立所有数据的索引\n    tab.IndexData();\n\n    // 表遍历\n    foreach (var kv in tab.ExampleData) \n    {\n        Console.Write(\"{0} {1}\\n\",kv.ID, kv.Name);\n    }\n\n    // 直接取值\n    Console.WriteLine(tab.ExtendData[1].Additive);\n\n    // KV配置\n    Console.WriteLine(tab.GetKeyValue_ExampleKV().ServerIP);\n}\n```\n\n* C#源码出于性能考虑, 默认读取tabtoy专用二进制格式\n\n* C#也可以读取JSON数据格式, 由于C#第三方JSON不统一, 请自行使用生成的源码与第三方源码对接\n\n[完整C#例子](https://github.com/davyxu/tabtoy/tree/master/v3/example/csharp)\n\n## Java使用表格导出的JSON数据\n\n导出命令行:\n```bash\ntabtoy.exe -mode=v3 -index=Index.xlsx -package=main -java_out=Table.java -json_out=table_gen.json\n```\n\n读取数据源码:\n\n```java\nimport main.Table;\nimport com.alibaba.fastjson.JSON;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\nimport java.util.Map;\n\npublic class Main {\n\n    // 从文件读取数据\n    private static String readFileAsString(String fileName)throws Exception\n    {\n        return new String(Files.readAllBytes(Paths.get(fileName)));\n    }\n    public static void main(String[] args) throws Exception {\n\n        // 从文件读取配置表\n        String data = null;\n        try {\n            data = readFileAsString(\"table_gen.json\");\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n\n        // 表格数据\n        Table tab;\n\n        // 从json序列化出对象\n        tab = JSON.parseObject(data, Table.class);\n\n        if(tab == null){\n            throw new Exception(\"parse table failed\");\n        }\n\n        // 构建索引\n        tab.BuildData();\n\n        // 测试输出\n        for(Map.Entry\u003cInteger, Table.ExampleData\u003e def : tab.ExampleDataByID.entrySet()){\n            System.out.println(def.getValue().Name);\n        }\n    }\n}\n```\n\n[完整Java例子](https://github.com/davyxu/tabtoy/tree/master/v3/example/java)\n\n## Lua使用表格导出的Lua数据(测试中)\n\n导出命令行:\n```bash\ntabtoy.exe -mode=v3 -index=Index.xlsx -lua_out=table_gen.lua\n```\n\n读取数据源码:\n\n```lua\n    -- 加载\n    local tab = {}\n    require(\"table_gen\").init(tab)\n    \n    -- 遍历表\n    print(\"Iterate lua table by order:\")\n    for _, v in ipairs(tab.ExampleData) do\n        print(v.ID, v.Name)\n    end\n\n    -- 通过索引访问\n    print(\"Access index table data:\")\n    print(tab.ExampleDataByID[300].ID)\n\n    -- 枚举类型访问\n    print(\"Use generated enum:\")\n    print(tab.ActorType.Pharah,  tab.ActorType[3])\n```\n\n[完整Lua例子](https://github.com/davyxu/tabtoy/tree/master/v3/example/lua)\n\n## 将表格类型信息导出为JSON格式\n\n导出命令行:\n```bash\ntabtoy -mode=v3 -index=Index.xlsx -jsontype_out=type_gen.json \n```\n\n## 导出为Protobuf格式\ntabtoy可以将表类型及结构输出为Google Protobuf的proto格式, 同时输出与之对应的二进制格式(*.pbb)\n\n使用Protobuf的SDK即可方便的将表数据提供给所有Protobuf支持的语言\n\n以下例子展示Golang使用Protobuf读取表格输出文件\n\n* 导出proto文件:\n```bash\ntabtoy -mode=v3 -index=Index.xlsx -proto_out=table.proto \n```\n\n* 导出proto二进制数据文件:\n```bash\ntabtoy -mode=v3 -index=Index.xlsx -pbbin_out=all.pbb\n```\n\n* Protobuf编译器protoc下载\n\n下载地址: https://github.com/protocolbuffers/protobuf/releases\n\n* 安装Golang的Protobuf生成插件\n```bash\ngo install google.golang.org/protobuf/cmd/protoc-gen-go\n```\n\n* 将proto文件生成代码\n```bash\nprotoc --go_out=. ./table.proto -I .\n```\n\n[完整Golang使用Protobuf例子](https://github.com/davyxu/tabtoy/tree/master/v3/example/protobuf/golang)\n\n# 按表导出\n\ntabtoy默认情况下, 均是将数据, 源码一次性导出.出于以下原因,tabtoy支持按表导出数据\n\n* 某些语言在读取大量数据时, 会出现兼容性问题. 例如: lua的local和const限制等\n\n* 按需读取数据, 降低内存需求\n\n* 按需更新数据, 减少模块耦合\n\n## Golang按需读取JSON数据\n\n导出命令行:\n```bash\ntabtoy -mode=v3 -index=Index.xlsx -package=main -go_out=table_gen.json -json_dir=.\n```\n\n读取数据源码:\n\n```go\n\tvar TabData = NewTable()\n\terr := tabtoy.LoadTableFromFile(TabData, \"../jsondir/ExampleData.json\")\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\tos.Exit(1)\n\t}\n\n\tfmt.Println(\"load specified table: ExampleData\")\n\tfor k, v := range TabData.ExampleDataByID {\n\t\tfmt.Println(k, v)\n\t}\n\n\t// 分表加载时, 不会触发pre/post Handler\n\tvar TabKV = NewTable()\n\terr = tabtoy.LoadTableFromFile(TabKV, \"../jsondir/ExampleKV.json\")\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\tos.Exit(1)\n\t}\n\n\tfmt.Println(\"load specified table: ExampleKV\")\n\tfor k, v := range TabKV.ExampleKV {\n\t\tfmt.Println(k, v)\n\t}\n```\n[完整Golang例子](https://github.com/davyxu/tabtoy/tree/master/v3/example/golang)\n\n## Lua按需读取Lua数据\n\n导出命令行:\n```bash\ntabtoy -mode=v3 -index=Index.xlsx -lua_dir=.\n```\n\n读取数据源码:\n\n```lua\n    local tabData = {}\n    require(\"ExampleData\").init(tabData)\n    require(\"ExtendData\").init(tabData)\n\n    print(\"Load 2 tables into one lua table:\")\n    for _, v in ipairs(tabData.ExampleData) do\n        print(v.ID, v.Name)\n    end\n    for _, v in ipairs(tabData.ExtendData) do\n        print(v.Additive)\n    end\n\n    print(\"Load kv table into single lua table:\")\n    local kvData = {}\n    require(\"ExampleKV\").init(kvData)\n    for _, v in ipairs(kvData.ExampleKV) do\n        print(v.ServerIP, v.ServerPort)\n    end\n\n    -- lua枚举是可选功能, 根据需要加载\n    local tabType = {}\n    require(\"_TableType\").init(tabType)\n    print(\"Use generated enum:\")\n    print(tabType.ActorType.Pharah,  tabType.ActorType[3])\n```\n\n[完整Lua例子](https://github.com/davyxu/tabtoy/tree/master/v3/example/lua)\n[导出的Lua表](https://github.com/davyxu/tabtoy/tree/master/v3/example/luasrc)\n\n## C#按需读取二进制数据\n导出命令行:\n```bash\ntabtoy -mode=v3 -index=Index.xlsx -package=main -csharp_out=table_gen.cs -binary_dir=.\n   ```\n\n读取数据源码:\n\n```cs\n static void LoadTableByName(main.Table tab,  string tableName)\n{\n    using (var stream = new FileStream(string.Format(\"../../../../binary/{0}.bin\", tableName), FileMode.Open))\n    {\n        stream.Position = 0;\n\n        var reader = new tabtoy.TableReader(stream);\n        try\n        {\n            tab.Deserialize(reader);\n        }\n        catch (Exception e)\n        {\n            Console.WriteLine(e);\n            throw;\n        }\n    }\n    \n    tab.IndexData(tableName);\n}\n\nstatic void LoadSpecifiedTable()\n{\n    var tabData = new main.Table();\n\n    LoadTableByName(tabData, \"ExampleData\");\n    LoadTableByName(tabData, \"ExtendData\");\n\n    Console.WriteLine(\"Load table merged into one class\");\n    // 表遍历\n    foreach (var kv in tabData.ExampleData)\n    {\n        Console.Write(\"{0} {1}\\n\", kv.ID, kv.Name);\n    }\n    // 表遍历\n    foreach (var kv in tabData.ExtendData)\n    {\n        Console.Write(\"{0}\\n\", kv.Additive);\n    }\n\n    Console.WriteLine(\"Load KV table into one class\");\n    var tabKV = new main.Table();\n    LoadTableByName(tabKV, \"ExampleKV\");\n\n    // KV配置\n    Console.WriteLine(tabKV.GetKeyValue_ExampleKV().ServerIP);\n}\n```\n\n[完整C#例子](https://github.com/davyxu/tabtoy/tree/master/v3/example/csharp)\n\n## Golang使用Protobuf按需读取二进制数据\n[Golang例子](https://github.com/davyxu/tabtoy/tree/master/v3/example/protobuf/golang)\n\n\n\n# 特色功能\n\n## 定义和使用枚举\n\n\n* 在类型表中定义枚举\n\n种类 | 对象类型 | 标识名 | 字段名 | 字段类型 | 数组切割| 值 | 索引 | 标记\n---|---|---|---|---|---|---|---|---\n枚举 | ActorType |   | None | int32|  | 0\n枚举 | ActorType | 法鸡 | Pharah | int32|  | 1\n枚举 | ActorType | 狂鼠 | Junkrat | string| | 2\n枚举 | ActorType | 源氏 | Genji | int32|  | 3\n枚举 | ActorType | 天使 | Mercy | string| | 4\n表头 | ExampleData | 类型 | Type | ActorType\n\n* 在数据表中使用枚举\n\n类型 |\n--- |\n狂鼠 |\nGenji |\n\n* 在数据表的枚举字段中, 枚举 字段名或标识名都会自动识别对应枚举值\n\n* 枚举只有枚举数值会被导出. 枚举标识名, 字段名均不会出现在数据中\n\n## 使用数组\n种类 | 对象类型 | 标识名 | 字段名 | 字段类型 | 数组切割| 值 | 索引 | 标记\n---|---|---|---|---|---|---|---|---\n表头 | ExampleData | 技能列表| Skill | int32 | \u003ccode\u003e\u0026#124;\u003c/code\u003e   | \n\n技能列表 |\n--- |\n\u003ccode\u003e2\u0026#124;3\u003c/code\u003e |\n1 |\n\n输出:\n\n [2, 3]\n \n [ 1 ]\n\n## 使用多列数组\n\n种类 | 对象类型 | 标识名 | 字段名 | 字段类型 | 数组切割| 值 | 索引 | 标记\n---|---|---|---|---|---|---|---|---\n表头 | ExampleData | 技能列表| Skill | int32 | \u003ccode\u003e\u0026#124;\u003c/code\u003e   | \n\n技能列表 | 技能列表\n--- | --- |\n2 | 3\n1 | \n\n输出:\n\n [2, 3 ]\n \n [ 1, 0 ]\n \n * 多列数组单元格所有数据会被自动切割并合并\n \n * 当数组字段拆分为多个同名列时, 导出数组将为空单元格默认填充类型默认值, 保证多列导出后, 数组数量统一\n \n * 切勿在拆分表中使用多列数组, 导出数据可能存在歧义\n\n## 为字段建立索引\n种类 | 对象类型 | 标识名 | 字段名 | 字段类型 | 数组切割| 值 | 索引 | 标记\n---|---|---|---|---|---|---|---|---\n表头 | ExampleData | ID| ID | int32 |  | |是| \n\n\n生成代码中, 会自动对数据创建索引, 例如:\n```go\nExampleDataByID map[int32]*ExampleData\n```\n\n## 表拆分\n\n将ExampleData表, 拆为Data.csv, Data2.csv表\n\n模式 | 表类型 | 表文件名\n---|---|---\n类型表 |        | Type.xlsx\n数据表 | ExampleData | Data.csv\n数据表 | ExampleData | Data2.csv\n\n每个表中的字段可按需填写\n\n## KV表\n\n准备类型表:\n\n模式 | 表类型 | 表文件名\n---|---|---\n类型表 |        | Type.xlsx\n数据表 | ExampleKV | KV.csv\n\n准备KV表:\n\n字段名 | 字段类型 | 标识名 |  值|  数组切割 | 标记\n---|---|---|---|---|---|\nServerIP | string | 服务器IP | 8.8.8.8\nServerPort | uint16 | 服务器端口 | 1024  \n\n## 空行分割\n\n表格数据如下:\n\nID | 名称\n---|---\n1 | 坦克\n2 | 法师\n(空行)  |\n3 | 治疗\n\n导出数据\n* 1 坦克\n* 2 法师\n\n导表工具在识别到空行后, 空行后的数据将被忽略\n\n## 行数据注释\n\n表格数据如下:\n\nID | 名称\n---|---\n1 | 坦克\n#2 | 法师\n3 | 治疗\n\n导出数据\n* 1 坦克\n* 3 治疗\n\n在任意表的首列单元格中首字符为#时，该行所有数据不会被导出\n\n## 列数据注释\n\n表格数据如下:\n\nID | #名称\n---|---\n1 | 坦克\n2 | 法师\n3 | 治疗\n\n导出数据\n* 1 \n* 2\n* 3 \n\n表头中, 列字段首字符为#时，该列所有数据按默认值导出 \n\n## 不导出指定表\n实现此功能需要使用到TagAction, 参考下面例子配置:\n\n在Index表中:\n\n模式 | 表类型 | 表文件名 | 标记\n---|---|---|---|\n数据表 | Effect | Effect.csv | client\n数据表 | Password | Server.csv | server\n\n* 客户端数据导出\n导出参数中新增参数\n```shell script\n--tag_action=nogentab:server\n```\n表示, 不导出带有server标记的所有表格\n\n* 服务器数据导出\n导出参数中新增参数\n```shell script\n--tag_action=nogentab:client\n```\n表示, 不导出带有client标记的所有表格\n\n## 不输出指定列数据\n实现此功能需要使用到TagAction, 参考下面例子配置:\n\n在Type表中:\n\n种类 | 对象类型 | 标识名 | 字段名 | 字段类型 | 数组切割| 值 | 索引 | 标记\n---|---|---|---|---|---|---|---|---\n表头 | ExampleData | 特效ID| EffectID | int32 |  | | | client \n表头 | ExampleData | 概率| Rate | float |  | | | server\n\n表中的特效ID, 只希望客户端导出数据中包含EffectID, 同时服务器导出数据中只包含Rate, 不希望将Rate字段导入客户端数据\n客户端导出为二进制, 服务器导出为json\n\n此时在相应字段所在的Type表中的\"标记\" 一列增加如表所示标记(如标记列不存在, 请新建)\n\n将原有导出流程拆分为客户端导出和服务器导出, 分两次分别导出不同需求的数据\n\n* 客户端数据导出\n导出参数中新增参数\n```shell script\n--tag_action=nogenfield_binary:server\n```\n表示: server标记的字段不导出到二进制\n\n* 服务器数据导出  \n导出参数中新增参数\n```shell script\n--tag_action=nogenfield_json:client\n```\n表示: client标记的字段不导出到json完整文件\n\n## TagAction参考说明\n\n### 格式\n```shell script\n--tag_action=action1:tag1+tag2|action2:tag1+tag3\n```\n* | 表示多个action\n* 被标记的tag, 将被对应action处理\n\n### action类型\naction | 适用范围 | 功能\n---|---|---|\nnogenfield_json | Type表 | 被标记的字段不导出到json完整文件中\nnogenfield_jsondir| Type表 | 被标记的字段不导出到每个表文件json\nnogenfield_binary| Type表 | 被标记的字段不导出到二进制中\nnogenfield_pbbin| Type表 | 被标记的字段不导出到Protobuf二进制中\nnogenfield_lua| Type表 | 被标记的字段不导出到Lua中\nnogenfield_csharp| Type表 | 被标记的字段不导出到C#中\nnogentab| Index表 | 被标记的表不会导出到任何输出中\n\n## 启用缓冲\n命令行中加入-usecache=true, 将启用缓存功能, 加速导出速度\n\n-cachedir参数设定缓存目录, 默认换出到tabtoy当前目录下的.tabtoycache目录\n\n# FAQ\n\n* 怎么让客户端和服务器通过标记分别导出\n\n    请为客户端和服务器分别编写两个tabtoy导出过程分别导出\n\n# V2版本说明\n\n\n* tabtoy 同时支持V2, V3版本导出\n\n* V2版本将不再获得更新\n\n* [V2文档](https://github.com/davyxu/tabtoy/blob/master/README_v2.md)\n\n# 备注\n\n感觉不错请star, 谢谢!\n\n知乎: [http://www.zhihu.com/people/sunicdavy](http://www.zhihu.com/people/sunicdavy)\n\n提交bug及特性: [https://github.com/davyxu/tabtoy/issues](https://github.com/davyxu/tabtoy/issues)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdavyxu%2Ftabtoy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdavyxu%2Ftabtoy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdavyxu%2Ftabtoy/lists"}