├── .gitattributes
├── .gitignore
├── README.md
├── cpptest
├── config
│ └── Achive.txt
├── cpptest.vcxproj
├── cpptest.vcxproj.filters
├── main.cpp
├── tableconfig.cpp
├── tableconfig.h
├── tablestruct.h
└── tabletool
│ ├── myconfig.h
│ ├── readtablefield.h
│ ├── readtablefile.cpp
│ ├── readtablefile.h
│ └── singleton.h
├── csharptest
├── App.config
├── Program.cs
├── Properties
│ └── AssemblyInfo.cs
├── TableConfig.cs
├── TableStruct.cs
├── config
│ └── Achive.txt
├── csharptest.csproj
└── tabtool
│ ├── MyConfig.cs
│ ├── ReadTable.cs
│ ├── SingletonTable.cs
│ └── TableManager.cs
├── tabtool.sln
├── tabtool
├── App.config
├── CmdlineHelper.cs
├── CodeGen.cs
├── ExcelHelper.cs
├── NPOI
│ ├── ICSharpCode.SharpZipLib.dll
│ ├── NPOI.OOXML.dll
│ ├── NPOI.OpenXml4Net.dll
│ ├── NPOI.OpenXmlFormats.dll
│ └── NPOI.dll
├── Program.cs
├── Properties
│ ├── AssemblyInfo.cs
│ ├── Resources.Designer.cs
│ ├── Resources.resx
│ ├── Settings.Designer.cs
│ └── Settings.settings
├── TableMeta.cs
├── TableStruct.cs
└── tabtool.csproj
└── test
├── Achive.xlsx
├── meta.tbs
└── 一键导表.bat
/.gitattributes:
--------------------------------------------------------------------------------
1 | ###############################################################################
2 | # Set default behavior to automatically normalize line endings.
3 | ###############################################################################
4 | * text=auto
5 |
6 | ###############################################################################
7 | # Set default behavior for command prompt diff.
8 | #
9 | # This is need for earlier builds of msysgit that does not have it on by
10 | # default for csharp files.
11 | # Note: This is only used by command line
12 | ###############################################################################
13 | #*.cs diff=csharp
14 |
15 | ###############################################################################
16 | # Set the merge driver for project and solution files
17 | #
18 | # Merging from the command prompt will add diff markers to the files if there
19 | # are conflicts (Merging from VS is not affected by the settings below, in VS
20 | # the diff markers are never inserted). Diff markers may cause the following
21 | # file extensions to fail to load in VS. An alternative would be to treat
22 | # these files as binary and thus will always conflict and require user
23 | # intervention with every merge. To do so, just uncomment the entries below
24 | ###############################################################################
25 | #*.sln merge=binary
26 | #*.csproj merge=binary
27 | #*.vbproj merge=binary
28 | #*.vcxproj merge=binary
29 | #*.vcproj merge=binary
30 | #*.dbproj merge=binary
31 | #*.fsproj merge=binary
32 | #*.lsproj merge=binary
33 | #*.wixproj merge=binary
34 | #*.modelproj merge=binary
35 | #*.sqlproj merge=binary
36 | #*.wwaproj merge=binary
37 |
38 | ###############################################################################
39 | # behavior for image files
40 | #
41 | # image files are treated as binary by default.
42 | ###############################################################################
43 | #*.jpg binary
44 | #*.png binary
45 | #*.gif binary
46 |
47 | ###############################################################################
48 | # diff behavior for common document formats
49 | #
50 | # Convert binary document formats to text before diffing them. This feature
51 | # is only available from the command line. Turn it on by uncommenting the
52 | # entries below.
53 | ###############################################################################
54 | #*.doc diff=astextplain
55 | #*.DOC diff=astextplain
56 | #*.docx diff=astextplain
57 | #*.DOCX diff=astextplain
58 | #*.dot diff=astextplain
59 | #*.DOT diff=astextplain
60 | #*.pdf diff=astextplain
61 | #*.PDF diff=astextplain
62 | #*.rtf diff=astextplain
63 | #*.RTF diff=astextplain
64 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 |
4 | # User-specific files
5 | *.suo
6 | *.user
7 | *.userosscache
8 | *.sln.docstates
9 |
10 | # User-specific files (MonoDevelop/Xamarin Studio)
11 | *.userprefs
12 |
13 | # Build results
14 | [Dd]ebug/
15 | [Dd]ebugPublic/
16 | [Rr]elease/
17 | [Rr]eleases/
18 | [Xx]64/
19 | [Xx]86/
20 | [Bb]uild/
21 | bld/
22 | [Bb]in/
23 | [Oo]bj/
24 |
25 | # Visual Studio 2015 cache/options directory
26 | .vs/
27 | # Uncomment if you have tasks that create the project's static files in wwwroot
28 | #wwwroot/
29 |
30 | # MSTest test Results
31 | [Tt]est[Rr]esult*/
32 | [Bb]uild[Ll]og.*
33 |
34 | # NUNIT
35 | *.VisualState.xml
36 | TestResult.xml
37 |
38 | # Build Results of an ATL Project
39 | [Dd]ebugPS/
40 | [Rr]eleasePS/
41 | dlldata.c
42 |
43 | # DNX
44 | project.lock.json
45 | artifacts/
46 |
47 | *_i.c
48 | *_p.c
49 | *_i.h
50 | *.ilk
51 | *.meta
52 | *.obj
53 | *.pch
54 | *.pdb
55 | *.pgc
56 | *.pgd
57 | *.rsp
58 | *.sbr
59 | *.tlb
60 | *.tli
61 | *.tlh
62 | *.tmp
63 | *.tmp_proj
64 | *.log
65 | *.vspscc
66 | *.vssscc
67 | .builds
68 | *.pidb
69 | *.svclog
70 | *.scc
71 |
72 | # Chutzpah Test files
73 | _Chutzpah*
74 |
75 | # Visual C++ cache files
76 | ipch/
77 | *.aps
78 | *.ncb
79 | *.opendb
80 | *.opensdf
81 | *.sdf
82 | *.cachefile
83 | *.VC.db
84 |
85 | # Visual Studio profiler
86 | *.psess
87 | *.vsp
88 | *.vspx
89 | *.sap
90 |
91 | # TFS 2012 Local Workspace
92 | $tf/
93 |
94 | # Guidance Automation Toolkit
95 | *.gpState
96 |
97 | # ReSharper is a .NET coding add-in
98 | _ReSharper*/
99 | *.[Rr]e[Ss]harper
100 | *.DotSettings.user
101 |
102 | # JustCode is a .NET coding add-in
103 | .JustCode
104 |
105 | # TeamCity is a build add-in
106 | _TeamCity*
107 |
108 | # DotCover is a Code Coverage Tool
109 | *.dotCover
110 |
111 | # NCrunch
112 | _NCrunch_*
113 | .*crunch*.local.xml
114 | nCrunchTemp_*
115 |
116 | # MightyMoose
117 | *.mm.*
118 | AutoTest.Net/
119 |
120 | # Web workbench (sass)
121 | .sass-cache/
122 |
123 | # Installshield output folder
124 | [Ee]xpress/
125 |
126 | # DocProject is a documentation generator add-in
127 | DocProject/buildhelp/
128 | DocProject/Help/*.HxT
129 | DocProject/Help/*.HxC
130 | DocProject/Help/*.hhc
131 | DocProject/Help/*.hhk
132 | DocProject/Help/*.hhp
133 | DocProject/Help/Html2
134 | DocProject/Help/html
135 |
136 | # Click-Once directory
137 | publish/
138 |
139 | # Publish Web Output
140 | *.[Pp]ublish.xml
141 | *.azurePubxml
142 |
143 | # TODO: Un-comment the next line if you do not want to checkin
144 | # your web deploy settings because they may include unencrypted
145 | # passwords
146 | #*.pubxml
147 | *.publishproj
148 |
149 | # NuGet Packages
150 | *.nupkg
151 | # The packages folder can be ignored because of Package Restore
152 | **/packages/*
153 | # except build/, which is used as an MSBuild target.
154 | !**/packages/build/
155 | # Uncomment if necessary however generally it will be regenerated when needed
156 | #!**/packages/repositories.config
157 | # NuGet v3's project.json files produces more ignoreable files
158 | *.nuget.props
159 | *.nuget.targets
160 |
161 | # Microsoft Azure Build Output
162 | csx/
163 | *.build.csdef
164 |
165 | # Microsoft Azure Emulator
166 | ecf/
167 | rcf/
168 |
169 | # Microsoft Azure ApplicationInsights config file
170 | ApplicationInsights.config
171 |
172 | # Windows Store app package directory
173 | AppPackages/
174 | BundleArtifacts/
175 |
176 | # Visual Studio cache files
177 | # files ending in .cache can be ignored
178 | *.[Cc]ache
179 | # but keep track of directories ending in .cache
180 | !*.[Cc]ache/
181 |
182 | # Others
183 | ClientBin/
184 | [Ss]tyle[Cc]op.*
185 | ~$*
186 | *~
187 | *.dbmdl
188 | *.dbproj.schemaview
189 | *.pfx
190 | *.publishsettings
191 | node_modules/
192 | orleans.codegen.cs
193 |
194 | # RIA/Silverlight projects
195 | Generated_Code/
196 |
197 | # Backup & report files from converting an old project file
198 | # to a newer Visual Studio version. Backup files are not needed,
199 | # because we have git ;-)
200 | _UpgradeReport_Files/
201 | Backup*/
202 | UpgradeLog*.XML
203 | UpgradeLog*.htm
204 |
205 | # SQL Server files
206 | *.mdf
207 | *.ldf
208 |
209 | # Business Intelligence projects
210 | *.rdl.data
211 | *.bim.layout
212 | *.bim_*.settings
213 |
214 | # Microsoft Fakes
215 | FakesAssemblies/
216 |
217 | # GhostDoc plugin setting file
218 | *.GhostDoc.xml
219 |
220 | # Node.js Tools for Visual Studio
221 | .ntvs_analysis.dat
222 |
223 | # Visual Studio 6 build log
224 | *.plg
225 |
226 | # Visual Studio 6 workspace options file
227 | *.opt
228 |
229 | # Visual Studio LightSwitch build output
230 | **/*.HTMLClient/GeneratedArtifacts
231 | **/*.DesktopClient/GeneratedArtifacts
232 | **/*.DesktopClient/ModelManifest.xml
233 | **/*.Server/GeneratedArtifacts
234 | **/*.Server/ModelManifest.xml
235 | _Pvt_Extensions
236 |
237 | # LightSwitch generated files
238 | GeneratedArtifacts/
239 | ModelManifest.xml
240 |
241 | # Paket dependency manager
242 | .paket/paket.exe
243 |
244 | # FAKE - F# Make
245 | .fake/
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # tabtool
2 | 导表工具,excel表格导出csv配置文件并生成C++\C#代码解析配表
3 |
4 | ## 推荐工作流:
5 | 策划案--解决方案--前后端配置需求汇总--表格版本--打表工具--配置文件--代码生成。
6 |
7 | ## 命名规则。
8 | 1. 驼峰命名。
9 | 2. 表格命名:系统名+表名.xsl
10 | 3. 字段命名:使用通用的单词 id type count 等
11 |
12 | ## excel表规则。
13 | - 第一行注释,给策划看,也会在生成代码中作为注释
14 | - 第二行name,也是生成代码中的结构体字段名称
15 | - 第三行filter,"client"标识该字段只导出到客户端配置文件,"server"标识只导出到服务器配置文件,"all"标识前后端都需要,"not"标识不导出该字段。
16 | - 第四行type,参考下面的字段类型说明。
17 | - 每个表第一个字段必须是id字段,id必须从1开始,0是读表错误。
18 | - id字段的filter如果标识为"client"则表示这个表只导出客户端配置文件,不导出服务器配表。反之亦然。
19 |
20 | ## 字段类型
21 |
22 | - int 整数和bool
23 | - float 浮点数
24 | - string 字符串
25 | - int+ 整数迭代
26 | - float+ 浮点数迭代
27 | - string+ 字符串迭代
28 | - tbsIdCount 定义在meta.tbs中的结构体
29 | - tbsIdCount+ 结构体迭代
30 |
31 | ## 复合字段及其迭代
32 | - 一级字段迭代:`11,22,33,44`在type中用`int+`表示。
33 | - 二级字段迭代:`1,1;2,2`在type中用`tbsIdCount+`表示。
34 | - 通过一个结构描述文件支持结构体,`meta.tbs`。
35 | - 我认为表字段结构体嵌套是没有意义的,所以仅支持到二级复合字段。
36 | - 注意excel中填写,时要设置单元格为文本模式,否则会变成数字分隔符。
37 | - tbs文件非常简单,如下就定义一个结构体tbsIdCount:
38 |
39 | ```c
40 | //表示id和数量
41 | tbsIdCount {
42 | id int
43 | count int
44 | }
45 | ```
46 |
47 | ## 代码生成
48 | - C++版本 tbs文件tablestruct.h csv文件生成生成一对tableconfig.h/tableconfig.cpp
49 | - C#版本 tbs文件生成TableStruct.cs csv文件生成TableConfig.cs
50 | - Go版本 TODO 暂时没用到,用到了再支持
51 |
52 | ## 错误检查
53 | 类型模式不匹配的字段会在打表过程中检查出来。
54 | ## 导表工具使用
55 | 参考test目录中`一键导出表.bat`的用法。
56 | ```
57 | "../tabtool/bin/Debug/tabtool.exe" --out_client ../csharptest/config/ --out_server ../cpptest/config/ --out_cpp ../cpptest/ --out_cs ../csharptest/ --in_excel ./ --in_tbs ./meta.tbs
58 | ```--out_client 指定导出客户端导出配置文件目录
59 | --out_server 导出服务器配置文件目录
60 | --out_cpp 导出C++代码目录,可选
61 | --out_cs 导出C#代码目录,可选
62 | --in_excel excel文件所在的目录
63 | --in_tbs tbs文件路径(表中用到的结构体)
64 |
65 | ## C++使用
66 |
67 |
68 |
--------------------------------------------------------------------------------
/cpptest/config/Achive.txt:
--------------------------------------------------------------------------------
1 | id line test1 test2 test3
2 | 1 1 1,100 -1,2,-3 1,1;2,2
3 | 2 1 1,1000 1,2,3,4 1,1;2,2;3,3
4 |
--------------------------------------------------------------------------------
/cpptest/cpptest.vcxproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | Win32
7 |
8 |
9 | Release
10 | Win32
11 |
12 |
13 | Debug
14 | x64
15 |
16 |
17 | Release
18 | x64
19 |
20 |
21 |
22 | {5AF57802-51EF-4574-BC38-4475B4F556A1}
23 | Win32Proj
24 | cpptest
25 | 8.1
26 |
27 |
28 |
29 | Application
30 | true
31 | v140
32 | Unicode
33 |
34 |
35 | Application
36 | false
37 | v140
38 | true
39 | Unicode
40 |
41 |
42 | Application
43 | true
44 | v140
45 | Unicode
46 |
47 |
48 | Application
49 | false
50 | v140
51 | true
52 | Unicode
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 | true
74 | bin
75 |
76 |
77 | true
78 |
79 |
80 | false
81 |
82 |
83 | false
84 |
85 |
86 |
87 |
88 |
89 | Level3
90 | Disabled
91 | _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
92 | true
93 |
94 |
95 | Console
96 | true
97 |
98 |
99 |
100 |
101 |
102 |
103 | Level3
104 | Disabled
105 | _CRT_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
106 | true
107 |
108 |
109 | Console
110 | true
111 |
112 |
113 |
114 |
115 | Level3
116 |
117 |
118 | MaxSpeed
119 | true
120 | true
121 | WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
122 | true
123 |
124 |
125 | Console
126 | true
127 | true
128 | true
129 |
130 |
131 |
132 |
133 | Level3
134 |
135 |
136 | MaxSpeed
137 | true
138 | true
139 | NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
140 | true
141 |
142 |
143 | Console
144 | true
145 | true
146 | true
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
--------------------------------------------------------------------------------
/cpptest/cpptest.vcxproj.filters:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
7 |
8 |
9 | {93995380-89BD-4b04-88EB-625FBE52EBFB}
10 | h;hh;hpp;hxx;hm;inl;inc;xsd
11 |
12 |
13 |
14 |
15 | Source Files
16 |
17 |
18 | tabletool
19 |
20 |
21 | Source Files
22 |
23 |
24 |
25 |
26 | tabletool
27 |
28 |
29 | tabletool
30 |
31 |
32 | tabletool
33 |
34 |
35 | tabletool
36 |
37 |
38 | Source Files
39 |
40 |
41 | Source Files
42 |
43 |
44 |
--------------------------------------------------------------------------------
/cpptest/main.cpp:
--------------------------------------------------------------------------------
1 | #include "tableconfig.h"
2 | #include
3 |
4 | int main()
5 | {
6 | if (LoadTableConfig())
7 | {
8 | auto item = Singleton::Instance()->GetTableItem(1);
9 | if (item != nullptr)
10 | {
11 | std::cout << item->test3[1].value << std::endl;
12 | }
13 | }
14 | }
--------------------------------------------------------------------------------
/cpptest/tableconfig.cpp:
--------------------------------------------------------------------------------
1 | //THIS FILE IS GENERATED BY tabtool, DO NOT EDIT IT!
2 | //GENERATE TIME [2017/2/28 11:08:53]
3 | #include "tableconfig.h"
4 |
5 | bool LoadTableConfig()
6 | {
7 | stConfigScope scope;
8 | if(false == Singleton::Instance()->Load())
9 | {
10 | ErrorLog("加载配置%s出错",Singleton::Instance()->GetTableFile().c_str() );
11 | return false;
12 | }
13 | return true;
14 | }
15 |
16 | bool cfgAchiveTable::Load()
17 | {
18 | ReadTableFile reader;
19 | reader.Initialize();
20 |
21 | if (!reader.Init(GetTableFile().c_str()))
22 | return false;
23 |
24 | DataReader dr;
25 | int iRows = reader.GetRowCount();
26 | int iCols = reader.GetColCount();
27 |
28 | for (int i = 1; i < iRows; ++i)
29 | {
30 | tbsAchiveItem item;
31 | item.id = atoi(reader.GetValue(i, "id"));
32 | item.line = atoi(reader.GetValue(i, "line"));
33 | item.test1 = dr.GetObject(reader.GetValue(i, "test1"));
34 | item.test2 = dr.GetIntList(reader.GetValue(i, "test2"));
35 | item.test3 = dr.GetObjectList(reader.GetValue(i, "test3"));
36 | m_Items[item.id] = item;
37 | }
38 |
39 | return true;
40 | }
41 |
--------------------------------------------------------------------------------
/cpptest/tableconfig.h:
--------------------------------------------------------------------------------
1 | //THIS FILE IS GENERATED BY tabtool, DO NOT EDIT IT!
2 | //GENERATE TIME [2017/2/28 11:08:53]
3 | #pragma once
4 | # include "tabletool/myconfig.h"
5 | # include "tabletool/singleton.h"
6 | # include "tabletool/readtablefield.h"
7 | # include "tablestruct.h"
8 |
9 |
10 | bool LoadTableConfig();
11 |
12 |
13 | struct tbsAchiveItem {
14 | int id;
15 | int line;
16 | tbsIdCount test1;
17 | vector test2;
18 | vector test3;
19 | };
20 |
21 | class cfgAchiveTable:public IConfigTable{
22 | public:
23 | virtual bool Load();
24 |
25 | string GetTableFile()
26 | {
27 | string f = WORK_DIR;
28 | f = f + "Achive.txt";
29 | return f;
30 | }
31 |
32 | };
33 |
34 |
--------------------------------------------------------------------------------
/cpptest/tablestruct.h:
--------------------------------------------------------------------------------
1 | //THIS FILE IS GENERATED BY tabtool, DO NOT EDIT IT!
2 | //GENERATE TIME [2017/2/28 11:08:53]
3 | #pragma once
4 | #include "tabletool/readtablefield.h"
5 | #include "tabletool/myconfig.h"
6 |
7 |
8 | struct tbsIdCount : public ITableObject
9 | {
10 | int id;
11 | int count;
12 |
13 | virtual bool FromString(string s)
14 | {
15 | DataReader dr;
16 | vector vs = dr.GetStringList(s,',');
17 | if (vs.size() != 2)
18 | {
19 | ErrorLog("tbsIdCount字段配置错误");
20 | return false;
21 | }
22 | id = stoi(vs[0]);
23 | count = stoi(vs[1]);
24 | return true;
25 | }
26 | };
27 |
28 |
29 | struct tbsKeyValue : public ITableObject
30 | {
31 | int key;
32 | int value;
33 |
34 | virtual bool FromString(string s)
35 | {
36 | DataReader dr;
37 | vector vs = dr.GetStringList(s,',');
38 | if (vs.size() != 2)
39 | {
40 | ErrorLog("tbsKeyValue字段配置错误");
41 | return false;
42 | }
43 | key = stoi(vs[0]);
44 | value = stoi(vs[1]);
45 | return true;
46 | }
47 | };
48 |
49 |
50 | struct tbsTest : public ITableObject
51 | {
52 | int a;
53 | string b;
54 | float c;
55 |
56 | virtual bool FromString(string s)
57 | {
58 | DataReader dr;
59 | vector vs = dr.GetStringList(s,',');
60 | if (vs.size() != 3)
61 | {
62 | ErrorLog("tbsTest字段配置错误");
63 | return false;
64 | }
65 | a = stoi(vs[0]);
66 | b = (vs[1]);
67 | c = stof(vs[2]);
68 | return true;
69 | }
70 | };
71 |
72 |
--------------------------------------------------------------------------------
/cpptest/tabletool/myconfig.h:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jwk000/tabtool/58474b13f1a2eae79e523317381580c407866676/cpptest/tabletool/myconfig.h
--------------------------------------------------------------------------------
/cpptest/tabletool/readtablefield.h:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jwk000/tabtool/58474b13f1a2eae79e523317381580c407866676/cpptest/tabletool/readtablefield.h
--------------------------------------------------------------------------------
/cpptest/tabletool/readtablefile.cpp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jwk000/tabtool/58474b13f1a2eae79e523317381580c407866676/cpptest/tabletool/readtablefile.cpp
--------------------------------------------------------------------------------
/cpptest/tabletool/readtablefile.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 | #include