diff --git a/.vs/ExcelTool/v15/.suo b/.vs/ExcelTool/v15/.suo index 64801cc..a99c5bf 100644 Binary files a/.vs/ExcelTool/v15/.suo and b/.vs/ExcelTool/v15/.suo differ diff --git a/.vs/ExcelTool/v15/Server/sqlite3/storage.ide b/.vs/ExcelTool/v15/Server/sqlite3/storage.ide index 7787d21..571b6a4 100644 Binary files a/.vs/ExcelTool/v15/Server/sqlite3/storage.ide and b/.vs/ExcelTool/v15/Server/sqlite3/storage.ide differ diff --git a/.vs/ExcelTool/v15/Server/sqlite3/storage.ide-shm b/.vs/ExcelTool/v15/Server/sqlite3/storage.ide-shm index 4c54e86..b7b4965 100644 Binary files a/.vs/ExcelTool/v15/Server/sqlite3/storage.ide-shm and b/.vs/ExcelTool/v15/Server/sqlite3/storage.ide-shm differ diff --git a/.vs/ExcelTool/v15/Server/sqlite3/storage.ide-wal b/.vs/ExcelTool/v15/Server/sqlite3/storage.ide-wal index 1540c52..d6f9a02 100644 Binary files a/.vs/ExcelTool/v15/Server/sqlite3/storage.ide-wal and b/.vs/ExcelTool/v15/Server/sqlite3/storage.ide-wal differ diff --git a/ExcelTool/ExcelHelper.cs b/ExcelTool/ExcelHelper.cs index c203e28..3a34e2a 100644 --- a/ExcelTool/ExcelHelper.cs +++ b/ExcelTool/ExcelHelper.cs @@ -1,21 +1,18 @@ -using NPOI.HSSF.UserModel; -using NPOI.SS.UserModel; +using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System; using System.Collections.Generic; -using System.Data; using System.IO; -using System.Text; namespace ExcelTool { public class ExcelHelper { - static DataTable ExcelHeader(string fileName) + public static List ExcelHeaders(string fileName) { try { - DataTable dt = new DataTable(); + var headers = new List(); IWorkbook wk = null; string extension = Path.GetExtension(fileName); FileStream fs = File.OpenRead(fileName); @@ -23,9 +20,11 @@ namespace ExcelTool wk = new XSSFWorkbook(fs); ISheet sheet = wk.GetSheetAt(0); IRow row = sheet.GetRow(0); //读取当前第一行的数据 + var descRow = sheet.GetRow(1);//读取注释 for (int j = 0; j < row.LastCellNum; j++) { string value = row.GetCell(j).ToString().Replace(" ", ""); + var descValue = descRow.GetCell(j) == null ? "" : descRow.GetCell(j).ToString(); var array = value.Split(','); if (array.Length != 2) { @@ -33,25 +32,12 @@ namespace ExcelTool } else { - DataColumn dc = new DataColumn($"{array[1]}|{array[0]}"); //命名|类型 - dt.Columns.Add(dc); + headers.Add(new TableExcelHeader() { FieldName = array[1], FieldType = array[0], FieldDesc = descValue }); } } - row = sheet.GetRow(1);//读取注释 - if (row != null) - { - DataRow dr = dt.NewRow(); - for (int j = 0; j < row.LastCellNum; j++) - { - var cellValue = row.GetCell(j); - string cellValueStr = cellValue == null ? "" : cellValue.ToString(); - dr[j] = cellValueStr; - } - dt.Rows.Add(dr); - } fs.Close(); fs.Dispose(); - return dt; + return headers; } catch (Exception ex) { @@ -60,56 +46,38 @@ namespace ExcelTool } } - public static DataTable Excel2DataTable(string fileName) + public static TableExcelData ExcelDatas(string fileName) { try { - DataTable dt = new DataTable(); + var excelHeader = ExcelHeaders(fileName); + var tableRows = new List(); IWorkbook wk = null; string extension = Path.GetExtension(fileName); FileStream fs = File.OpenRead(fileName); if (extension.Equals(".xlsx")) wk = new XSSFWorkbook(fs); ISheet sheet = wk.GetSheetAt(0); - IRow row = sheet.GetRow(0); //读取当前第一行的数据 - for (int j = 0; j < row.LastCellNum; j++) - { - var cellValue = row.GetCell(j); - if (cellValue == null) - { - throw new Exception($"文件:{fileName}第一行存在空类型配置,请检查"); - } - string value = row.GetCell(j).ToString().Replace(" ", "").Replace("\"", ""); - var array = value.Split(','); - if (array.Length != 2) - { - ConsoleHelper.WriteErrorLine("表格第一行类型定义有异常,不是类型,命名的形式"); - } - else - { - DataColumn dc = new DataColumn($"{array[1]}|{array[0]}"); //命名|类型 - dt.Columns.Add(dc); - } - } //跳过注释读取数据 for (int i = 2; i <= sheet.LastRowNum; i++) { - row = sheet.GetRow(i); - var dr = dt.NewRow(); - for (int j = 0; j < row.LastCellNum; j++) + var row = sheet.GetRow(i); + var tableExcelRow = new TableExcelRow(); + for (int j = 0; j <= row.LastCellNum; j++) { var cellValue = row.GetCell(j); if (cellValue != null) - dr[j] = row.GetCell(j).ToString().Replace(" ", ""); + tableExcelRow.Add(row.GetCell(j).ToString().Replace(" ", "")); else - dr[j] = ""; + tableExcelRow.Add(""); } - dt.Rows.Add(dr); + tableRows.Add(tableExcelRow); } fs.Close(); fs.Dispose(); - return dt; + var tableExcelData = new TableExcelData(excelHeader, tableRows); + return tableExcelData; } catch (Exception ex) { @@ -117,253 +85,5 @@ namespace ExcelTool return null; } } - - public static bool GenBinaryData(string fileName) - { - try - { - FileInfo fileInfo = new FileInfo(fileName); - var excelName = fileInfo.Name.Remove(fileInfo.Name.IndexOf(".xlsx")); - - //先写入行数,然后没一行的数据一次写入 小写类型、字符串 - List> datas = new List>(); - var dataTable = Excel2DataTable(fileName); - Tuple rowCount = new Tuple("int", dataTable.Rows.Count.ToString()); - datas.Add(rowCount); - foreach (DataRow row in dataTable.Rows) - { - for (int i = 0; i < dataTable.Columns.Count; i++) - { - var typeHeader = dataTable.Columns[i].ToString().ToLower(); - var headers = typeHeader.Split('|'); - Tuple t = new Tuple(headers[1], row[i].ToString()); - datas.Add(t); - } - } - var binaryFilePath = Path.Combine(fileInfo.DirectoryName, $"{excelName}.bytes"); - FileManager.WriteBinaryDatasToFile(binaryFilePath, datas); - return true; - } - catch (Exception ex) - { - ConsoleHelper.WriteErrorLine(ex.ToString()); - return false; - } - } - - /// - /// 生成对应的C#Model类 - /// - /// - /// - public static bool GenCSharpModel(string fileName) - { - try - { - FileInfo fileInfo = new FileInfo(fileName); - var excelName = fileInfo.Name.Remove(fileInfo.Name.IndexOf(".xlsx")); - var dt = ExcelHeader(fileName); - var headers = dt.Headers(); - List notesStr = new List(); - if (dt.Rows != null && dt.Rows.Count > 0) - { - var notes = dt.Rows[0]; - for (int i = 0; i < dt.Columns.Count; i++) - { - notesStr.Add(notes[i].ToString()); - } - } - //前面是字段,后面是类型 vector是3个float [1.1,2.2,3.3] - //foreach (var header in headers) - //{ - // ConsoleHelper.WriteInfoLine($"{header.Item1}|{header.Item2}"); - //} - StringBuilder sb = new StringBuilder(); - sb.Append($"/*\n * auto generated by tools(注意:千万不要手动修改本文件)\n * {excelName}\n */\n"); - sb.Append("using System;\nusing System.IO;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Linq;\n\n"); - sb.Append("[Serializable]\n"); - sb.Append($"public class {excelName} : IBinarySerializable\n"); - sb.Append("{\n"); - for (int i = 0; i < headers.Count; i++) - { - sb.Append($"\t/// \n"); - sb.Append($"\t/// {notesStr[i]}\n"); - sb.Append($"\t/// \n"); - var type = headers[i].Item2.ToLower(); - if (type.Equals("vector")) - { - sb.Append(string.Format("\tpublic List {0}", headers[i].Item1)); - } - else if (type.Equals("list")) - { - sb.Append(string.Format("\tpublic List> {0}", headers[i].Item1)); - } - else - { - sb.Append(string.Format("\tpublic {0} {1}", headers[i].Item2.ToLower(), headers[i].Item1)); - } - sb.Append(" { get; set; }\n"); - } - sb.Append("\n\tpublic void DeSerialize(BinaryReader reader)\n"); - sb.Append("\t{\n"); - foreach (var header in headers) - { - var type = header.Item2.ToLower(); - var name = header.Item1.ToString(); - if (type.Equals("int")) - { - sb.Append($"\t\t{name} = reader.ReadInt32();\n"); - } - else if (type.Equals("bool")) - { - sb.Append($"\t\t{name} = reader.ReadBoolean();\n"); - } - else if (type.Equals("float")) - { - sb.Append($"\t\t{name} = reader.ReadSingle();\n"); - } - else if (type.Equals("string")) - { - sb.Append($"\t\t{name} = reader.ReadString();\n"); - } - else if (type.Equals("vector")) - { - sb.Append($"\t\tvar {name}Count = reader.ReadInt32();\n"); - sb.Append($"\t\tif ({name}Count > 0)\n"); - sb.Append("\t\t{\n"); - sb.Append($"\t\t\t{name} = new List();\n"); - sb.Append($"\t\t\tfor (int i = 0; i < {name}Count; i++)\n"); - sb.Append("\t\t\t{\n"); - sb.Append($"\t\t\t\t{name}.Add(reader.ReadSingle());\n"); - sb.Append("\t\t\t}\n"); - sb.Append("\t\t}\n"); - sb.Append("\t\telse\n"); - sb.Append("\t\t{\n"); - sb.Append($"\t\t\t{name} = null;\n"); - sb.Append("\t\t}\n"); - } - else if (type.Equals("list")) - { - sb.Append($"\t\tvar {name}Count = reader.ReadInt32();\n"); - sb.Append($"\t\tif ({name}Count > 0)\n"); - sb.Append("\t\t{\n"); - sb.Append($"\t\t\t{name} = new List>();\n"); - sb.Append($"\t\t\tfor (int i = 0; i < {name}Count; i++)\n"); - sb.Append("\t\t\t{\n"); - sb.Append($"\t\t\t\tvar tempList = new List();\n"); - sb.Append($"\t\t\t\tvar tempListCount = reader.ReadInt32();\n"); - sb.Append($"\t\t\t\tfor (int j = 0; j < tempListCount; j++)\n"); - sb.Append("\t\t\t\t{\n"); - sb.Append($"\t\t\t\t\ttempList.Add(reader.ReadSingle());\n"); - sb.Append("\t\t\t\t}\n"); - sb.Append($"\t\t\t\t{name}.Add(tempList);\n"); - sb.Append("\t\t\t}\n"); - sb.Append("\t\t}\n"); - sb.Append("\t\telse\n"); - sb.Append("\t\t{\n"); - sb.Append($"\t\t\t{name} = null;\n"); - sb.Append("\t\t}\n"); - } - else - { - ConsoleHelper.WriteErrorLine($"类型:{type}没有解析 {fileName}处理异常"); - return false; - } - } - sb.Append("\t}\n\n"); - sb.Append("\tpublic void Serialize(BinaryWriter writer)\n"); - sb.Append("\t{\n"); - foreach (var header in headers) - { - var type = header.Item2.ToLower(); - var name = header.Item1.ToString(); - if (type.Equals("int") || type.Equals("bool") || type.Equals("float") || type.Equals("string")) - { - sb.Append($"\t\twriter.Write({name});\n"); - } - else if (type.Equals("vector")) - { - sb.Append($"\t\tif ({name} == null || {name}.Count == 0)\n"); - sb.Append("\t\t{\n"); - sb.Append("\t\t\twriter.Write(0);\n"); - sb.Append("\t\t}\n"); - sb.Append("\t\telse\n"); - sb.Append("\t\t{\n"); - sb.Append($"\t\t\twriter.Write({name}.Count);\n"); - sb.Append($"\t\t\tfor (int i = 0; i < {name}.Count; i++)\n"); - sb.Append("\t\t\t{\n"); - sb.Append($"\t\t\t\twriter.Write({name}[i]);\n"); - sb.Append("\t\t\t}\n"); - sb.Append("\t\t}\n"); - } - else if (type.Equals("list")) - { - sb.Append($"\t\tif ({name} == null || {name}.Count == 0)\n"); - sb.Append("\t\t{\n"); - sb.Append("\t\t\twriter.Write(0);\n"); - sb.Append("\t\t}\n"); - sb.Append("\t\telse\n"); - sb.Append("\t\t{\n"); - sb.Append($"\t\t\twriter.Write({name}.Count);\n"); - sb.Append($"\t\t\tfor (int i = 0; i < {name}.Count; i++)\n"); - sb.Append("\t\t\t{\n"); - sb.Append($"\t\t\t\twriter.Write({name}[i].Count);\n"); - sb.Append($"\t\t\t\tfor (int j = 0; j < {name}[i].Count; j++)\n"); - sb.Append("\t\t\t\t{\n"); - sb.Append($"\t\t\t\t\twriter.Write({name}[i][j]);\n"); - sb.Append("\t\t\t\t}\n"); - sb.Append("\t\t\t}\n"); - sb.Append("\t\t}\n"); - } - else - { - ConsoleHelper.WriteErrorLine($"类型:{type}没有解析 {fileName}处理异常"); - return false; - } - } - sb.Append("\t}\n"); - sb.Append("}\n"); - - sb.Append("\n"); - sb.Append("[Serializable]\n"); - sb.Append($"public partial class {excelName}Config : IBinarySerializable\n"); - sb.Append("{\n"); - sb.Append($"\tpublic List<{excelName}> {excelName}Infos = new List<{excelName}>();\n"); - sb.Append($"\tpublic void DeSerialize(BinaryReader reader)\n"); - sb.Append("\t{\n"); - sb.Append($"\t\tint count = reader.ReadInt32();\n"); - sb.Append($"\t\tfor (int i = 0;i < count; i++)\n"); - sb.Append("\t\t{\n"); - sb.Append($"\t\t\t{excelName} tempData = new {excelName}();\n"); - sb.Append($"\t\t\ttempData.DeSerialize(reader);\n"); - sb.Append($"\t\t\t{excelName}Infos.Add(tempData);\n"); - sb.Append("\t\t}\n"); - sb.Append("\t}\n"); - sb.Append("\n"); - sb.Append("\tpublic void Serialize(BinaryWriter writer)\n"); - sb.Append("\t{\n"); - sb.Append($"\t\twriter.Write({excelName}Infos.Count);\n"); - sb.Append($"\t\tfor (int i = 0; i < {excelName}Infos.Count; i++)\n"); - sb.Append("\t\t{\n"); - sb.Append($"\t\t\t{excelName}Infos[i].Serialize(writer);\n"); - sb.Append("\t\t}\n"); - sb.Append("\t}\n\n"); - sb.Append($"\tpublic IEnumerable<{excelName}> QueryById(int id)\n"); - sb.Append("\t{\n"); - sb.Append($"\t\tvar datas = from d in {excelName}Infos\n"); - sb.Append($"\t\t\t\t\twhere d.Id == id\n"); - sb.Append($"\t\t\t\t\tselect d;\n"); - sb.Append("\t\treturn datas;\n"); - sb.Append("\t}\n"); - sb.Append("}\n"); - FileManager.WriteToFile(Path.Combine(fileInfo.DirectoryName, $"{excelName}.cs"), sb.ToString()); - return true; - } - catch (Exception ex) - { - ConsoleHelper.WriteErrorLine(ex.ToString()); - return false; - } - } } } diff --git a/ExcelTool/ExcelTool.csproj b/ExcelTool/ExcelTool.csproj index 7eaf1ad..c0f0255 100644 --- a/ExcelTool/ExcelTool.csproj +++ b/ExcelTool/ExcelTool.csproj @@ -70,6 +70,12 @@ + + + + + + diff --git a/ExcelTool/Parser/GenModels.cs b/ExcelTool/Parser/GenModels.cs new file mode 100644 index 0000000..693585e --- /dev/null +++ b/ExcelTool/Parser/GenModels.cs @@ -0,0 +1,237 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ExcelTool +{ + public class GenModels + { + /// + /// 生成对应的C#Model类 + /// + /// + /// + public static bool GenCSharpModel(string fileName, string outputDir) + { + if (string.IsNullOrEmpty(fileName)) + { + ConsoleHelper.WriteErrorLine("GenCSharpModel 参数传递有误"); + return false; + } + try + { + FileInfo fileInfo = new FileInfo(fileName); + if (string.IsNullOrEmpty(outputDir)) + { + outputDir = fileInfo.DirectoryName; + } + var headers = ExcelHelper.ExcelHeaders(fileName); + var excelName = fileInfo.Name.Remove(fileInfo.Name.IndexOf(".xlsx")); + //var dt = ExcelHeader(fileName); + //var headers = dt.Headers(); + //List notesStr = new List(); + //if (dt.Rows != null && dt.Rows.Count > 0) + //{ + // var notes = dt.Rows[0]; + // for (int i = 0; i < dt.Columns.Count; i++) + // { + // notesStr.Add(notes[i].ToString()); + // } + //} + //前面是字段,后面是类型 vector是3个float [1.1,2.2,3.3] + //foreach (var header in headers) + //{ + // ConsoleHelper.WriteInfoLine($"{header.Item1}|{header.Item2}"); + //} + StringBuilder sb = new StringBuilder(); + sb.Append($"/*\n * auto generated by tools(注意:千万不要手动修改本文件)\n * {excelName}\n */\n"); + sb.Append("using System;\nusing System.IO;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Linq;\n\n"); + sb.Append("[Serializable]\n"); + sb.Append($"public class {excelName} : IBinarySerializable\n"); + sb.Append("{\n"); + for (int i = 0; i < headers.Count; i++) + { + sb.Append($"\t/// \n"); + sb.Append($"\t/// {headers[i].FieldDesc}\n"); + sb.Append($"\t/// \n"); + var type = headers[i].FieldType.ToLower(); + if (type.Equals("vector")) + { + sb.Append(string.Format("\tpublic List {0}", headers[i].FieldName)); + } + else if (type.Equals("list")) + { + sb.Append(string.Format("\tpublic List> {0}", headers[i].FieldName)); + } + else + { + sb.Append(string.Format("\tpublic {0} {1}", headers[i].FieldType.ToLower(), headers[i].FieldName)); + } + sb.Append(" { get; set; }\n"); + } + sb.Append("\n\tpublic void DeSerialize(BinaryReader reader)\n"); + sb.Append("\t{\n"); + foreach (var header in headers) + { + var type = header.FieldType.ToLower(); + var name = header.FieldName; + if (type.Equals("int")) + { + sb.Append($"\t\t{name} = reader.ReadInt32();\n"); + } + else if (type.Equals("bool")) + { + sb.Append($"\t\t{name} = reader.ReadBoolean();\n"); + } + else if (type.Equals("float")) + { + sb.Append($"\t\t{name} = reader.ReadSingle();\n"); + } + else if (type.Equals("string")) + { + sb.Append($"\t\t{name} = reader.ReadString();\n"); + } + else if (type.Equals("vector")) + { + sb.Append($"\t\tvar {name}Count = reader.ReadInt32();\n"); + sb.Append($"\t\tif ({name}Count > 0)\n"); + sb.Append("\t\t{\n"); + sb.Append($"\t\t\t{name} = new List();\n"); + sb.Append($"\t\t\tfor (int i = 0; i < {name}Count; i++)\n"); + sb.Append("\t\t\t{\n"); + sb.Append($"\t\t\t\t{name}.Add(reader.ReadSingle());\n"); + sb.Append("\t\t\t}\n"); + sb.Append("\t\t}\n"); + sb.Append("\t\telse\n"); + sb.Append("\t\t{\n"); + sb.Append($"\t\t\t{name} = null;\n"); + sb.Append("\t\t}\n"); + } + else if (type.Equals("list")) + { + sb.Append($"\t\tvar {name}Count = reader.ReadInt32();\n"); + sb.Append($"\t\tif ({name}Count > 0)\n"); + sb.Append("\t\t{\n"); + sb.Append($"\t\t\t{name} = new List>();\n"); + sb.Append($"\t\t\tfor (int i = 0; i < {name}Count; i++)\n"); + sb.Append("\t\t\t{\n"); + sb.Append($"\t\t\t\tvar tempList = new List();\n"); + sb.Append($"\t\t\t\tvar tempListCount = reader.ReadInt32();\n"); + sb.Append($"\t\t\t\tfor (int j = 0; j < tempListCount; j++)\n"); + sb.Append("\t\t\t\t{\n"); + sb.Append($"\t\t\t\t\ttempList.Add(reader.ReadSingle());\n"); + sb.Append("\t\t\t\t}\n"); + sb.Append($"\t\t\t\t{name}.Add(tempList);\n"); + sb.Append("\t\t\t}\n"); + sb.Append("\t\t}\n"); + sb.Append("\t\telse\n"); + sb.Append("\t\t{\n"); + sb.Append($"\t\t\t{name} = null;\n"); + sb.Append("\t\t}\n"); + } + else + { + ConsoleHelper.WriteErrorLine($"类型:{type}没有解析 {fileName}处理异常"); + return false; + } + } + sb.Append("\t}\n\n"); + sb.Append("\tpublic void Serialize(BinaryWriter writer)\n"); + sb.Append("\t{\n"); + foreach (var header in headers) + { + var type = header.FieldType.ToLower(); + var name = header.FieldName; + if (type.Equals("int") || type.Equals("bool") || type.Equals("float") || type.Equals("string")) + { + sb.Append($"\t\twriter.Write({name});\n"); + } + else if (type.Equals("vector")) + { + sb.Append($"\t\tif ({name} == null || {name}.Count == 0)\n"); + sb.Append("\t\t{\n"); + sb.Append("\t\t\twriter.Write(0);\n"); + sb.Append("\t\t}\n"); + sb.Append("\t\telse\n"); + sb.Append("\t\t{\n"); + sb.Append($"\t\t\twriter.Write({name}.Count);\n"); + sb.Append($"\t\t\tfor (int i = 0; i < {name}.Count; i++)\n"); + sb.Append("\t\t\t{\n"); + sb.Append($"\t\t\t\twriter.Write({name}[i]);\n"); + sb.Append("\t\t\t}\n"); + sb.Append("\t\t}\n"); + } + else if (type.Equals("list")) + { + sb.Append($"\t\tif ({name} == null || {name}.Count == 0)\n"); + sb.Append("\t\t{\n"); + sb.Append("\t\t\twriter.Write(0);\n"); + sb.Append("\t\t}\n"); + sb.Append("\t\telse\n"); + sb.Append("\t\t{\n"); + sb.Append($"\t\t\twriter.Write({name}.Count);\n"); + sb.Append($"\t\t\tfor (int i = 0; i < {name}.Count; i++)\n"); + sb.Append("\t\t\t{\n"); + sb.Append($"\t\t\t\twriter.Write({name}[i].Count);\n"); + sb.Append($"\t\t\t\tfor (int j = 0; j < {name}[i].Count; j++)\n"); + sb.Append("\t\t\t\t{\n"); + sb.Append($"\t\t\t\t\twriter.Write({name}[i][j]);\n"); + sb.Append("\t\t\t\t}\n"); + sb.Append("\t\t\t}\n"); + sb.Append("\t\t}\n"); + } + else + { + ConsoleHelper.WriteErrorLine($"类型:{type}没有解析 {fileName}处理异常"); + return false; + } + } + sb.Append("\t}\n"); + sb.Append("}\n"); + + sb.Append("\n"); + sb.Append("[Serializable]\n"); + sb.Append($"public partial class {excelName}Config : IBinarySerializable\n"); + sb.Append("{\n"); + sb.Append($"\tpublic List<{excelName}> {excelName}Infos = new List<{excelName}>();\n"); + sb.Append($"\tpublic void DeSerialize(BinaryReader reader)\n"); + sb.Append("\t{\n"); + sb.Append($"\t\tint count = reader.ReadInt32();\n"); + sb.Append($"\t\tfor (int i = 0;i < count; i++)\n"); + sb.Append("\t\t{\n"); + sb.Append($"\t\t\t{excelName} tempData = new {excelName}();\n"); + sb.Append($"\t\t\ttempData.DeSerialize(reader);\n"); + sb.Append($"\t\t\t{excelName}Infos.Add(tempData);\n"); + sb.Append("\t\t}\n"); + sb.Append("\t}\n"); + sb.Append("\n"); + sb.Append("\tpublic void Serialize(BinaryWriter writer)\n"); + sb.Append("\t{\n"); + sb.Append($"\t\twriter.Write({excelName}Infos.Count);\n"); + sb.Append($"\t\tfor (int i = 0; i < {excelName}Infos.Count; i++)\n"); + sb.Append("\t\t{\n"); + sb.Append($"\t\t\t{excelName}Infos[i].Serialize(writer);\n"); + sb.Append("\t\t}\n"); + sb.Append("\t}\n\n"); + sb.Append($"\tpublic IEnumerable<{excelName}> QueryById(int id)\n"); + sb.Append("\t{\n"); + sb.Append($"\t\tvar datas = from d in {excelName}Infos\n"); + sb.Append($"\t\t\t\t\twhere d.Id == id\n"); + sb.Append($"\t\t\t\t\tselect d;\n"); + sb.Append("\t\treturn datas;\n"); + sb.Append("\t}\n"); + sb.Append("}\n"); + FileManager.WriteToFile(Path.Combine(outputDir, $"{excelName}.cs"), sb.ToString()); + return true; + } + catch (Exception ex) + { + ConsoleHelper.WriteErrorLine(ex.ToString()); + return false; + } + } + } +} diff --git a/ExcelTool/Parser/TableExcelData.cs b/ExcelTool/Parser/TableExcelData.cs new file mode 100644 index 0000000..6ba4968 --- /dev/null +++ b/ExcelTool/Parser/TableExcelData.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ExcelTool +{ + public class TableExcelData + { + private List headers = new List(); + private List rows = new List(); + public int CollonCount = 0; + + public TableExcelData(IEnumerable headers, IEnumerable rows) + { + this.headers = headers.ToList(); + this.rows = rows.ToList(); + this.CollonCount = this.headers.Count; + } + + public List Headers + { + get { return this.headers; } + } + + public List Rows + { + get { return this.rows; } + } + + //TODO:待检查数据类型的合法性 + //public bool CheckUnique(out string errorMsg) + //{ + + //} + } +} diff --git a/ExcelTool/Parser/TableExcelExportBytes.cs b/ExcelTool/Parser/TableExcelExportBytes.cs new file mode 100644 index 0000000..54b85af --- /dev/null +++ b/ExcelTool/Parser/TableExcelExportBytes.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.IO; + +namespace ExcelTool +{ + public class TableExcelExportBytes + { + public static bool ExportToFile(string fileName, string outputDir = null) + { + try + { + FileInfo fileInfo = new FileInfo(fileName); + if (string.IsNullOrEmpty(outputDir)) + { + outputDir = fileInfo.DirectoryName; + } + var excelName = fileInfo.Name.Remove(fileInfo.Name.IndexOf(".xlsx")); + //先写入行数,然后每一行的数据一次写入 小写类型、字符串 + List> datas = new List>(); + var tableData = ExcelHelper.ExcelDatas(fileName); + Tuple rowCount = new Tuple("int", tableData.CollonCount.ToString()); + datas.Add(rowCount); + foreach (var row in tableData.Rows) + { + for (int i = 0; i < tableData.CollonCount; i++) + { + var type = tableData.Headers[i].FieldType.ToLower(); + var data = row.StrList[i]; + datas.Add(new Tuple(type, data)); + } + } + var binaryFilePath = Path.Combine(outputDir, $"{excelName}.bytes"); + FileManager.WriteBinaryDatasToFile(binaryFilePath, datas); + return true; + } + catch (Exception ex) + { + ConsoleHelper.WriteErrorLine(ex.ToString()); + return false; + } + } + } +} diff --git a/ExcelTool/Parser/TableExcelHeader.cs b/ExcelTool/Parser/TableExcelHeader.cs new file mode 100644 index 0000000..42500ec --- /dev/null +++ b/ExcelTool/Parser/TableExcelHeader.cs @@ -0,0 +1,9 @@ +namespace ExcelTool +{ + public class TableExcelHeader + { + public string FieldName { get; set; } + public string FieldType { get; set; } + public string FieldDesc { get; set; } + } +} diff --git a/ExcelTool/Parser/TableExcelRow.cs b/ExcelTool/Parser/TableExcelRow.cs new file mode 100644 index 0000000..a63d6f9 --- /dev/null +++ b/ExcelTool/Parser/TableExcelRow.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; + +namespace ExcelTool +{ + public class TableExcelRow + { + public List StrList { get; set; } + public TableExcelRow() + { + StrList = new List(); + } + + public void Add(string str) + { + StrList.Add(str); + } + } +} diff --git a/ExcelTool/Parser/TableExportFormat.cs b/ExcelTool/Parser/TableExportFormat.cs new file mode 100644 index 0000000..1572558 --- /dev/null +++ b/ExcelTool/Parser/TableExportFormat.cs @@ -0,0 +1,29 @@ +namespace ExcelTool +{ + /// + /// 导出格式 + /// + public enum TableExportFormat + { + /// + /// 未知 + /// + Unknown = 0, + /// + /// 二进制 + /// + Bytes, + /// + /// Json格式 + /// + Json, + /// + /// Xml格式 + /// + Xml, + /// + /// Lua格式 + /// + Lua, + } +} diff --git a/ExcelTool/Program.cs b/ExcelTool/Program.cs index 2f41183..4508bb3 100644 --- a/ExcelTool/Program.cs +++ b/ExcelTool/Program.cs @@ -9,10 +9,16 @@ namespace ExcelTool static void Main(string[] args) { string path = AppDomain.CurrentDomain.BaseDirectory; - if (args != null && args.Length >= 1) + string exportPath = ""; + //TableExportFormat format = TableExportFormat.Bytes; + if (args != null && args.Length == 1) { path = args[0]; //第一个是路径 } + if (args != null && args.Length == 2) + { + exportPath = args[1]; //第二个是输出路径 + } DirectoryInfo dirInfo = new DirectoryInfo(path); var csvs = dirInfo.GetFiles("*.csv", SearchOption.AllDirectories); var excels = dirInfo.GetFiles("*.xlsx", SearchOption.AllDirectories); @@ -47,7 +53,7 @@ namespace ExcelTool foreach (var file in excels) { //生成CS文件 - bool res = ExcelHelper.GenCSharpModel(file.FullName); + bool res = GenModels.GenCSharpModel(file.FullName, exportPath); if (res) { ConsoleHelper.WriteSuccessLine($"{file.Name}CS模板生成成功"); @@ -58,7 +64,7 @@ namespace ExcelTool } //生成二进制文件,如果list或者vector数据为空则写入0,要根据类型来读取csv的字段数据强转成对应的数据类型然后写入 - res = ExcelHelper.GenBinaryData(file.FullName); + res = TableExcelExportBytes.ExportToFile(file.FullName, exportPath); if (res) { ConsoleHelper.WriteSuccessLine($"{file.Name}二进制数据生成成功"); diff --git a/ExcelTool/bin/Debug/ExcelTool.exe b/ExcelTool/bin/Debug/ExcelTool.exe index 25b7d52..9f8d76a 100644 Binary files a/ExcelTool/bin/Debug/ExcelTool.exe and b/ExcelTool/bin/Debug/ExcelTool.exe differ diff --git a/ExcelTool/bin/Debug/ExcelTool.pdb b/ExcelTool/bin/Debug/ExcelTool.pdb index bfde550..7b8dff9 100644 Binary files a/ExcelTool/bin/Debug/ExcelTool.pdb and b/ExcelTool/bin/Debug/ExcelTool.pdb differ diff --git a/ExcelTool/bin/Debug/avatarguideTest.bytes b/ExcelTool/bin/Debug/avatarguideTest.bytes index 6117da0..ad46acc 100644 Binary files a/ExcelTool/bin/Debug/avatarguideTest.bytes and b/ExcelTool/bin/Debug/avatarguideTest.bytes differ diff --git a/ExcelTool/bin/Debug/official_room.bytes b/ExcelTool/bin/Debug/official_room.bytes index e238f47..3fc6a57 100644 Binary files a/ExcelTool/bin/Debug/official_room.bytes and b/ExcelTool/bin/Debug/official_room.bytes differ diff --git a/ExcelTool/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/ExcelTool/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache index 13efad3..3f151ce 100644 Binary files a/ExcelTool/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache and b/ExcelTool/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ diff --git a/ExcelTool/obj/Debug/ExcelTool.csproj.CoreCompileInputs.cache b/ExcelTool/obj/Debug/ExcelTool.csproj.CoreCompileInputs.cache index 98c577d..01c0f1c 100644 --- a/ExcelTool/obj/Debug/ExcelTool.csproj.CoreCompileInputs.cache +++ b/ExcelTool/obj/Debug/ExcelTool.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -3770a330c7ef4b58251471e824d29ae88622bbc0 +5be383d8458e8adf3321425f1a6ef7ed98f16846 diff --git a/ExcelTool/obj/Debug/ExcelTool.exe b/ExcelTool/obj/Debug/ExcelTool.exe index 25b7d52..9f8d76a 100644 Binary files a/ExcelTool/obj/Debug/ExcelTool.exe and b/ExcelTool/obj/Debug/ExcelTool.exe differ diff --git a/ExcelTool/obj/Debug/ExcelTool.pdb b/ExcelTool/obj/Debug/ExcelTool.pdb index bfde550..7b8dff9 100644 Binary files a/ExcelTool/obj/Debug/ExcelTool.pdb and b/ExcelTool/obj/Debug/ExcelTool.pdb differ