diff --git a/ExcelTool/ExcelHelper.cs b/ExcelTool/ExcelHelper.cs index a9029c9..77baa82 100644 --- a/ExcelTool/ExcelHelper.cs +++ b/ExcelTool/ExcelHelper.cs @@ -3,6 +3,7 @@ using NPOI.XSSF.UserModel; using System; using System.Collections.Generic; using System.IO; +using ExcelTool.Parser; namespace ExcelTool { @@ -12,36 +13,41 @@ namespace ExcelTool { try { - var headers = new List(); - IWorkbook wk = null; - string extension = Path.GetExtension(fileName); - FileStream fs = File.OpenRead(fileName); - if (extension.Equals(".xlsx")) - wk = new XSSFWorkbook(fs); + List headers = new(); + + using FileStream fs = File.OpenRead(fileName); + IWorkbook 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++) + + IRow nameRow = sheet.GetRow(0); // 字段名 + IRow typeRow = sheet.GetRow(1); // 类型 + IRow descRow = sheet.GetRow(2); // 注释 + + for (int j = 0; j < nameRow.LastCellNum; j++) { - string value = row.GetCell(j).ToString(); - var descValue = descRow.GetCell(j) == null ? "" : descRow.GetCell(j).ToString(); - var array = value.Split(','); - if (array.Length != 2) + string fieldName = nameRow.GetCell(j)?.ToString() ?? ""; + string fieldType = typeRow.GetCell(j)?.ToString() ?? ""; + string fieldDesc = descRow.GetCell(j)?.ToString() ?? ""; + + if (string.IsNullOrEmpty(fieldName)) { - ConsoleHelper.WriteErrorLine("表格第一行类型定义有异常,不是类型,命名的形式"); + $"列 {j} 字段名为空".WriteErrorLine(); + continue; } - else + + headers.Add(new TableExcelHeader() { - headers.Add(new TableExcelHeader() { FieldName = array[1], FieldType = array[0], FieldDesc = descValue }); - } + FieldName = fieldName, + FieldType = fieldType, + FieldDesc = fieldDesc + }); } - fs.Close(); - fs.Dispose(); + return headers; } catch (Exception ex) { - ConsoleHelper.WriteErrorLine(ex.ToString()); + ex.ToString().WriteErrorLine(); return null; } } @@ -52,38 +58,61 @@ namespace ExcelTool { 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); + + using FileStream fs = File.OpenRead(fileName); + IWorkbook wk = new XSSFWorkbook(fs); ISheet sheet = wk.GetSheetAt(0); - //跳过注释读取数据 - for (int i = 2; i <= sheet.LastRowNum; i++) + + for (int i = 6; i <= sheet.LastRowNum; i++) { - var row = sheet.GetRow(i); + IRow row = sheet.GetRow(i); + if (row == null) continue; + var tableExcelRow = new TableExcelRow(); + for (int j = 0; j < excelHeader.Count; j++) { - var cellValue = row.GetCell(j); - if (cellValue != null) - tableExcelRow.Add(row.GetCell(j).ToString()); - else - tableExcelRow.Add(""); + var cell = row.GetCell(j); + tableExcelRow.Add(GetCellValue(cell)); } + tableRows.Add(tableExcelRow); } - fs.Close(); - fs.Dispose(); - var tableExcelData = new TableExcelData(excelHeader, tableRows); - return tableExcelData; + return new TableExcelData(excelHeader, tableRows); } catch (Exception ex) { - ConsoleHelper.WriteErrorLine(ex.ToString()); + ex.ToString().WriteErrorLine(); return null; } } + private static string GetCellValue(ICell cell) + { + if (cell == null) + return ""; + + switch (cell.CellType) + { + case CellType.String: + return cell.StringCellValue; + + case CellType.Numeric: + if (DateUtil.IsCellDateFormatted(cell)) + { + return cell.DateCellValue.ToString(); + } + return cell.NumericCellValue.ToString(); + + case CellType.Boolean: + return cell.BooleanCellValue ? "1" : "0"; + + case CellType.Formula: + return cell.ToString(); + + default: + return ""; + } + } } } diff --git a/ExcelTool/FileManager.cs b/ExcelTool/FileManager.cs index 6930a51..d802640 100644 --- a/ExcelTool/FileManager.cs +++ b/ExcelTool/FileManager.cs @@ -81,6 +81,50 @@ namespace ExcelTool bw.Write(Convert.ToInt32(data.Item2)); } } + else if (data.Item1.Equals("uint")) + { + if (string.IsNullOrEmpty(data.Item2)) + { + bw.Write(Convert.ToUInt32(0)); + } + else + { + bw.Write(Convert.ToUInt32(data.Item2)); + } + } + else if (data.Item1.Equals("ushort")) + { + if (string.IsNullOrEmpty(data.Item2)) + { + bw.Write(Convert.ToUInt16(0)); + } + else + { + bw.Write(Convert.ToUInt16(data.Item2)); + } + } + else if (data.Item1.Equals("sbyte")) + { + if (string.IsNullOrEmpty(data.Item2)) + { + bw.Write(Convert.ToSByte(0)); + } + else + { + bw.Write(Convert.ToSByte(data.Item2)); + } + } + else if (data.Item1.Equals("byte")) + { + if (string.IsNullOrEmpty(data.Item2)) + { + bw.Write(Convert.ToByte(0)); + } + else + { + bw.Write(Convert.ToByte(data.Item2)); + } + } else if (data.Item1.Equals("bool")) { if (string.IsNullOrEmpty(data.Item2)) @@ -283,6 +327,34 @@ namespace ExcelTool bw.Write(Convert.ToInt32(numStrs[i])); } } + else if (listType.Equals("uint")) + { + for (int i = 0; i < numStrs.Length; i++) + { + bw.Write(Convert.ToUInt32(numStrs[i])); + } + } + else if (listType.Equals("ushort")) + { + for (int i = 0; i < numStrs.Length; i++) + { + bw.Write(Convert.ToUInt16(numStrs[i])); + } + } + else if (listType.Equals("sbyte")) + { + for (int i = 0; i < numStrs.Length; i++) + { + bw.Write(Convert.ToSByte(numStrs[i])); + } + } + else if (listType.Equals("byte")) + { + for (int i = 0; i < numStrs.Length; i++) + { + bw.Write(Convert.ToByte(numStrs[i])); + } + } else if (listType.Equals("bool")) { for (int i = 0; i < numStrs.Length; i++) diff --git a/ExcelTool/Parser/GenModels.cs b/ExcelTool/Parser/GenModels.cs index 9f18ace..c354667 100644 --- a/ExcelTool/Parser/GenModels.cs +++ b/ExcelTool/Parser/GenModels.cs @@ -1,8 +1,8 @@ -using System; +using System; using System.IO; using System.Text; -namespace ExcelTool +namespace ExcelTool.Parser { public class GenModels { @@ -36,7 +36,14 @@ namespace ExcelTool for (int i = 0; i < headers.Count; i++) { sb.Append($"\t/// \n"); - sb.Append($"\t/// {headers[i].FieldDesc}\n"); + var descLines = headers[i].FieldDesc?.Replace("\r", "").Split('\n'); + if (descLines != null) + { + foreach (var line in descLines) + { + sb.Append($"\t/// {line}\n"); + } + } sb.Append($"\t/// \n"); var type = headers[i].FieldType.ToLower(); if (type.Equals("vector")) @@ -67,6 +74,22 @@ namespace ExcelTool { sb.Append(string.Format("\tpublic List {0}", headers[i].FieldName)); } + else if (type.Equals("uintlist")) + { + sb.Append(string.Format("\tpublic List {0}", headers[i].FieldName)); + } + else if (type.Equals("ushortlist")) + { + sb.Append(string.Format("\tpublic List {0}", headers[i].FieldName)); + } + else if (type.Equals("sbytelist")) + { + sb.Append(string.Format("\tpublic List {0}", headers[i].FieldName)); + } + else if (type.Equals("bytelist")) + { + sb.Append(string.Format("\tpublic List {0}", headers[i].FieldName)); + } else if (type.Contains("list<")) { var tempS = type.Substring(5); @@ -100,7 +123,8 @@ namespace ExcelTool { sb.Append(string.Format("\tpublic {0} {1}", headers[i].FieldType.ToLower(), headers[i].FieldName)); } - sb.Append(" { get; set; }\n"); + sb.Append(" { get; set; }\n\n"); + } sb.Append("\n\tpublic void DeSerialize(BinaryReader reader)\n"); sb.Append("\t{\n"); @@ -112,6 +136,22 @@ namespace ExcelTool { sb.Append($"\t\t{name} = reader.ReadInt32();\n"); } + else if (type.Equals("uint")) + { + sb.Append($"\t\t{name} = reader.ReadUInt32();\n"); + } + else if (type.Equals("ushort")) + { + sb.Append($"\t\t{name} = reader.ReadUInt16();\n"); + } + else if (type.Equals("sbyte")) + { + sb.Append($"\t\t{name} = reader.ReadSByte();\n"); + } + else if (type.Equals("byte")) + { + sb.Append($"\t\t{name} = reader.ReadByte();\n"); + } else if (type.Equals("bool")) { sb.Append($"\t\t{name} = reader.ReadBoolean();\n"); @@ -297,7 +337,7 @@ namespace ExcelTool } else { - ConsoleHelper.WriteErrorLine($"类型:{type}没有解析 {fileName}处理异常"); + $"类型:{type}没有解析 {fileName}处理异常".WriteErrorLine(); return false; } } @@ -308,7 +348,14 @@ namespace ExcelTool { var type = header.FieldType.ToLower(); var name = header.FieldName; - if (type.Equals("int") || type.Equals("bool") || type.Equals("float") || type.Equals("string")) + if (type.Equals("int") || + type.Equals("bool") || + type.Equals("float") || + type.Equals("string") || + type.Equals("uint") || + type.Equals("ushort") || + type.Equals("sbyte") || + type.Equals("byte")) { sb.Append($"\t\twriter.Write({name});\n"); } diff --git a/ExcelTool/Parser/TableExcelData.cs b/ExcelTool/Parser/TableExcelData.cs index d98da89..e60c4c1 100644 --- a/ExcelTool/Parser/TableExcelData.cs +++ b/ExcelTool/Parser/TableExcelData.cs @@ -1,10 +1,7 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; -namespace ExcelTool +namespace ExcelTool.Parser { public class TableExcelData { diff --git a/ExcelTool/Parser/TableExcelExportBytes.cs b/ExcelTool/Parser/TableExcelExportBytes.cs index 7164629..c1e1957 100644 --- a/ExcelTool/Parser/TableExcelExportBytes.cs +++ b/ExcelTool/Parser/TableExcelExportBytes.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.IO; -namespace ExcelTool +namespace ExcelTool.Parser { public class TableExcelExportBytes { diff --git a/ExcelTool/Parser/TableExcelHeader.cs b/ExcelTool/Parser/TableExcelHeader.cs index 42500ec..9e5cec2 100644 --- a/ExcelTool/Parser/TableExcelHeader.cs +++ b/ExcelTool/Parser/TableExcelHeader.cs @@ -1,4 +1,4 @@ -namespace ExcelTool +namespace ExcelTool.Parser { public class TableExcelHeader { diff --git a/ExcelTool/Parser/TableExcelRow.cs b/ExcelTool/Parser/TableExcelRow.cs index a63d6f9..e46d7b1 100644 --- a/ExcelTool/Parser/TableExcelRow.cs +++ b/ExcelTool/Parser/TableExcelRow.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace ExcelTool +namespace ExcelTool.Parser { public class TableExcelRow { diff --git a/ExcelTool/Parser/TableExportFormat.cs b/ExcelTool/Parser/TableExportFormat.cs index 1572558..00083fa 100644 --- a/ExcelTool/Parser/TableExportFormat.cs +++ b/ExcelTool/Parser/TableExportFormat.cs @@ -1,4 +1,4 @@ -namespace ExcelTool +namespace ExcelTool.Parser { /// /// 导出格式 diff --git a/ExcelTool/Program.cs b/ExcelTool/Program.cs index eeb9ed5..31b8160 100644 --- a/ExcelTool/Program.cs +++ b/ExcelTool/Program.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using ExcelTool.Parser; namespace ExcelTool { @@ -13,36 +14,36 @@ namespace ExcelTool string exportPath = ""; //TableExportFormat format = TableExportFormat.Bytes; - if (args != null && args.Length == 1) + if (args is { Length: >= 1 }) { path = args[0]; //第一个是路径 } - if (args != null && args.Length == 2) + if (args is { Length: >= 2 }) { exportPath = args[1]; //第二个是输出路径 } DirectoryInfo dirInfo = new DirectoryInfo(path); - var csvs = dirInfo.GetFiles("*.csv", SearchOption.AllDirectories); - var excels = dirInfo.GetFiles("*.xlsx", SearchOption.AllDirectories); + FileInfo[] csvs = dirInfo.GetFiles("*.csv", SearchOption.AllDirectories); + FileInfo[] excels = dirInfo.GetFiles("*.xlsx", SearchOption.AllDirectories); if ((csvs == null || csvs.Length <= 0) && (excels == null || excels.Length <= 0)) { - ConsoleHelper.WriteErrorLine("当前exe目录或者目标目录没有csv文件或者excels文件,请重新设置目录"); + "当前exe目录或者目标目录没有csv文件或者excels文件,请重新设置目录".WriteErrorLine(); } else { - ConsoleHelper.WriteSuccessLine("=========================================================="); - ConsoleHelper.WriteSuccessLine("== 根据csv/xlsx生成模板代码和二进制文件工具 =="); - ConsoleHelper.WriteSuccessLine("== 说明:将exe放在csv/xlsx目录中或者exe或者传入csv根目录 =="); - ConsoleHelper.WriteSuccessLine("=========================================================="); + "==========================================================".WriteSuccessLine(); + "== 根据csv/xlsx生成模板代码和二进制文件工具 ==".WriteSuccessLine(); + "== 说明:将exe放在csv/xlsx目录中或者exe或者传入csv根目录 ==".WriteSuccessLine(); + "==========================================================".WriteSuccessLine(); - List genExcels = new List(); - foreach (var csv in csvs) + List genExcels = []; + foreach (FileInfo csv in csvs) { //生成对应的xlsx文件 var tempPath = CsvHelper.CsvToXlsx(csv.FullName); if (string.IsNullOrEmpty(tempPath)) { - ConsoleHelper.WriteErrorLine($"csv:{csv.FullName}生成xlsx文件出错"); + $"csv:{csv.FullName}生成xlsx文件出错".WriteErrorLine(); } else { @@ -58,22 +59,22 @@ namespace ExcelTool bool res = GenModels.GenCSharpModel(file.FullName, exportPath); if (res) { - ConsoleHelper.WriteSuccessLine($"{file.Name}CS模板生成成功"); + $"{file.Name}CS模板生成成功".WriteSuccessLine(); } else { - ConsoleHelper.WriteErrorLine($"{file.Name}CS模板生成失败"); + $"{file.Name}CS模板生成失败".WriteErrorLine(); } //生成二进制文件,如果list或者vector数据为空则写入0,要根据类型来读取csv的字段数据强转成对应的数据类型然后写入 res = TableExcelExportBytes.ExportToFile(file.FullName, exportPath); if (res) { - ConsoleHelper.WriteSuccessLine($"{file.Name}二进制数据生成成功"); + $"{file.Name}二进制数据生成成功".WriteSuccessLine(); } else { - ConsoleHelper.WriteErrorLine($"{file.Name}二进制数据生成失败"); + $"{file.Name}二进制数据生成失败".WriteErrorLine(); } }