internal TableMeta ParseTableMeta(string filename, DataTable dt, string cmp) { TableMeta meta = new TableMeta(); meta.TableName = filename; //第0行注释 第一行name 第二行type for (int i = 0; i < dt.Columns.Count; i++) { if (!IsExportField(cmp, dt, i)) { continue; } TableField field = new TableField(); field.fieldName = dt.Rows[1].ItemArray[i].ToString(); field.typeName = dt.Rows[2].ItemArray[i].ToString(); if (field.typeName == "int") { field.fieldType = TableFieldType.IntField; } else if (field.typeName == "float") { field.fieldType = TableFieldType.FloatField; } else if (field.typeName == "string") { field.fieldType = TableFieldType.StringField; } else if (field.typeName == "int+") { field.fieldType = TableFieldType.IntList; } else if (field.typeName == "float+") { field.fieldType = TableFieldType.FloatList; } else if (field.typeName == "string+") { field.fieldType = TableFieldType.StringList; } else if (field.typeName[field.typeName.Length - 1] == '+') { field.fieldType = TableFieldType.StructList; } else { field.fieldType = TableFieldType.StructField; } meta.Fields.Add(field); } return(meta); }
static void Main(string[] args) { string clientOutDir, serverOutDir, cppOutDir, csOutDir, excelDir, metafile; CmdlineHelper cmder = new CmdlineHelper(args); if (cmder.Has("--out_client")) { clientOutDir = cmder.Get("--out_client"); } else { return; } if (cmder.Has("--out_server")) { serverOutDir = cmder.Get("--out_server"); } else { return; } if (cmder.Has("--in_excel")) { excelDir = cmder.Get("--in_excel"); } else { return; } if (cmder.Has("--in_tbs")) { metafile = cmder.Get("--in_tbs"); } else { return; } //创建导出目录 if (!Directory.Exists(clientOutDir)) { Directory.CreateDirectory(clientOutDir); } if (!Directory.Exists(serverOutDir)) { Directory.CreateDirectory(serverOutDir); } //先读取tablemata文件 TableStruct tbs = new TableStruct(); if (!tbs.ImportTableStruct(metafile)) { Console.WriteLine("解析tbs文件错误!"); return; } Console.WriteLine("解析tbs文件成功"); List <TableMeta> clientTableMetaList = new List <TableMeta>(); List <TableMeta> serverTableMetaList = new List <TableMeta>(); //导出文件 ExcelHelper helper = new ExcelHelper(); string[] files = Directory.GetFiles(excelDir, "*.xlsx", SearchOption.TopDirectoryOnly); foreach (string filepath in files) { string xmlfile = clientOutDir + Path.GetFileNameWithoutExtension(filepath) + ".txt"; string txtfile = serverOutDir + Path.GetFileNameWithoutExtension(filepath) + ".txt"; try { DataTable dt = helper.ImportExcelFile(filepath); if (helper.IsExportFile("client", dt)) { helper.ExportTxtFileEx(xmlfile, dt, "client", new int[] { 0, 2, 3 }); TableMeta meta = helper.ParseTableMeta(Path.GetFileNameWithoutExtension(filepath), dt, "client"); clientTableMetaList.Add(meta); } if (helper.IsExportFile("server", dt)) { helper.ExportTxtFileEx(txtfile, dt, "server", new int[] { 0, 2, 3 }); TableMeta meta = helper.ParseTableMeta(Path.GetFileNameWithoutExtension(filepath), dt, "server"); serverTableMetaList.Add(meta); } } catch (Exception e) { Console.WriteLine(filepath + " 文件出错!"); Console.WriteLine(e.ToString()); } } Console.WriteLine("导出配置文件成功"); //生成代码 if (cmder.Has("--out_cpp")) { cppOutDir = cmder.Get("--out_cpp"); if (!Directory.Exists(cppOutDir)) { Directory.CreateDirectory(cppOutDir); } CodeGen.MakeCppFileTbs(tbs.GetMetaList(), cppOutDir); CodeGen.MakeCppFile(serverTableMetaList, cppOutDir); Console.WriteLine("生成.cpp代码文件成功"); } if (cmder.Has("--out_cs")) { csOutDir = cmder.Get("--out_cs"); if (!Directory.Exists(csOutDir)) { Directory.CreateDirectory(csOutDir); } CodeGen.MakeCsharpFileTbs(tbs.GetMetaList(), csOutDir); CodeGen.MakeCsharpFile(clientTableMetaList, csOutDir); Console.WriteLine("生成.cs代码文件成功"); } Console.WriteLine("按任意键退出..."); Console.ReadKey(false); }
public bool ImportTableStruct(string filepath) { m_metaList.Clear(); string[] lines = File.ReadAllLines(filepath); for (int i = 0; i < lines.Count(); i++) { if (Regex.IsMatch(lines[i], @"^\s*//.*$")) { continue; } //注释 if (Regex.IsMatch(lines[i], @"^\s*$")) { continue; } //空行 if (Regex.IsMatch(lines[i], @"^\s*\w+\s+{\s*$")) //结构体开始 { if (m_parseState != ParseState.EndStruct) { Console.WriteLine("tbs文件错误:第{0}行", i); return(false); } m_parseState = ParseState.BeginStruct; Match match = Regex.Match(lines[i], @"^\s*(\w+)\s+{\s*$"); m_tableMeta = new TableMeta(); m_tableMeta.TableName = match.Groups[1].Value; continue; } if (Regex.IsMatch(lines[i], @"^\s*}\s*$"))//结构体结束 { if (m_parseState != ParseState.BeginStruct) { Console.WriteLine("tbs文件错误:第{0}行", i); return(false); } m_parseState = ParseState.EndStruct; m_metaList.Add(m_tableMeta); continue; } if (m_parseState == ParseState.BeginStruct) { Match m = Regex.Match(lines[i], @"\s*(\w+)\s+(\w+)\s*$");//var type if (m.Success == false) { Console.WriteLine("tbs文件错误:第{0}行", i); return(false); } TableField field = new TableField(); field.fieldName = m.Groups[1].Value; field.typeName = m.Groups[2].Value; switch (field.typeName) { case "int": { field.fieldType = TableFieldType.IntField; break; } case "float": { field.fieldType = TableFieldType.FloatField; break; } case "string": { field.fieldType = TableFieldType.StringField; break; } case "int+": { field.fieldType = TableFieldType.IntList; break; } case "float+": { field.fieldType = TableFieldType.FloatList; break; } case "string+": { field.fieldType = TableFieldType.StringList; break; } default: Console.WriteLine("tbs文件错误:第{0}行", i); return(false); } m_tableMeta.Fields.Add(field); continue; } Console.WriteLine("tbs文件错误:第{0}行", i); return(false); } return(true); }