From 547d234ad39f5b563698cab612a12bbb564505d5 Mon Sep 17 00:00:00 2001 From: "Bob.Song" <605277374@qq.com> Date: Thu, 9 Oct 2025 17:55:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=BC=E8=A1=A8=E5=B7=A5=E5=85=B7=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Config/Excel/BaitConfig.xlsx | Bin 9867 -> 10010 bytes Config/Excel/UnitConfig.xlsx | Bin 9876 -> 10550 bytes Config/Excel/~$UnitConfig.xlsx | Bin 0 -> 165 bytes .../ConfigBuilder.sln.DotSettings.user | 5 +- .../NBConfigBuilder/Exporter/ExcelExporter.cs | 845 +++++++----------- .../NBConfigBuilder/Exporter/ExcelTable.cs | 17 +- .../NBConfigBuilder/Exporter/ExcelTemplate.cs | 5 + .../Exporter/ExcelWorksheets.cs | 44 +- .../NBConfigBuilder/Exporter/ExportInfo.cs | 17 - .../NBConfigBuilder/Form1.Designer.cs | 4 +- Tools/ConfigBuilder/NBConfigBuilder/Form1.cs | 60 +- 11 files changed, 423 insertions(+), 574 deletions(-) create mode 100644 Config/Excel/~$UnitConfig.xlsx delete mode 100644 Tools/ConfigBuilder/NBConfigBuilder/Exporter/ExportInfo.cs diff --git a/Config/Excel/BaitConfig.xlsx b/Config/Excel/BaitConfig.xlsx index b01335fa7dba3c37fb675bca27b1650a94ab407f..1f100b90a3fb70bd7afa0bde0cec4331dd2a165c 100644 GIT binary patch delta 2116 zcmV-K2)p--O`1-yp8*6ni*n$TqX8^`baitJZHH3_f&Cn7o^1wSG6hp9S%;20{9pq#~V6ytBN10(I94V^M@%F^w%-{}x{$QHa8Pwt&9 zPsXNcq9*BL`1~<`UEM!*tA?d&Z^Z%Sso<0wV6HZ~EtNlKiU+0kd=;~9e?IS;4YR1rRHgkeN?EEs2LDGD>v{au7it&oYLa5a{u{z_vy)XDu#*^%1D7%?l)Yy zpVz6h}ID5_ztZ9Phfk@R%= zf`>tUd74mCku&oWlKZl>;VKvYLR)8^3=&yj<%qt%m7gGS35$D4vy^=k%WVt7f2_|_ z*R@xdm6sGv6$+qW?qjxjs~E{6#E`pQiaYQpb>KGRuPBGRdgM1UaQ*f2lmb`Y3=YNT zmHQ=lj)Mtzh@gK{Tvy7q!_dnSXE_0{{V!_a*HDPxRia+ERqaH-!QxK%jNUS~A=!WF ziCtIj!fkDTk@|qs%auVn58iafvnC{i6!7ZgDGWmBIyw3f@3jnn;zB189Gi>+SQi3? ziV%2jLc*CBK85|?XgDMn;qcys2Xil+DDk7=k4-qdx8b2TAFp`c!~mH#e@5W2tkRc! z1bW^@>m?<%0}}@Kyebi&|LOArZezlYU$_-4t^~G{EoeZl0#bC`3{M&+A@djKa2+@P}?-_J!&+DDG9?bY^%D ztylSGqq$>?q;Fjfe;GehjOMkC}n(Cl*x7?3qSXD|8ZFV z08mQ<1PTBElZXTpvmgm41_>AR7h$&n007pLP!Ak`lR<0LKp2Mag8w1RNg;NUY$~NB zDOwZ+J#EE9kupiX-3*&d*37KBu!mmCw$@TFdnyzPr4)Lo(nE_Z_-kghr~UlB`7! z9|Tf=D$CRg8Inw?{wk$1$)I3zsqBL=N~f#}rp&bJQrWM7r7{ChMNU1(c}fe$1+kKH zAXG?v(`6v|hXJhDpyiV&kUR=h)DEbM0y>}6V8DgKOsdMP7}L3P^F5}ux5?MBaW?s` zx2Kr?Ir*v&uQ7dTfrCI?-Q$j<9e$`K5oJ-A#9AmlwZ(T-{Cg8jkV7 z?fCGK-r0YQr8Z9ivo~c5IfgGf9iFgc_?*c`!D|p*mEnqaz`I%Fe?O}#Y&58?8dRT- zXIJOgyX=_D#WZGIN&3m`n=Qxv|HLM5*|A;Qvs+k5ZDz-@4I|gX(xP31*6lj^keY!x zOI**f{brLzQloX96z44IZRG$-M(@4j7zXfmv006cSlSw8#2K^!c0001O6YeMg delta 1966 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 literal 9876 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 JJKZ1O{s)0$qs#yR diff --git a/Config/Excel/~$UnitConfig.xlsx b/Config/Excel/~$UnitConfig.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..036bba4a9a3ddca9c4938aaef5d8dcdedfb73c41 GIT binary patch literal 165 lcmZQ~^9*uzatu)*4X`t~F?ccrF}N}~F*q`WFeuOz0sugf56J)k literal 0 HcmV?d00001 diff --git a/Tools/ConfigBuilder/ConfigBuilder.sln.DotSettings.user b/Tools/ConfigBuilder/ConfigBuilder.sln.DotSettings.user index bc0585f..d5915f5 100644 --- a/Tools/ConfigBuilder/ConfigBuilder.sln.DotSettings.user +++ b/Tools/ConfigBuilder/ConfigBuilder.sln.DotSettings.user @@ -1,3 +1,6 @@  + ForceIncluded + ForceIncluded ForceIncluded - ForceIncluded \ No newline at end of file + ForceIncluded + ForceIncluded \ No newline at end of file diff --git a/Tools/ConfigBuilder/NBConfigBuilder/Exporter/ExcelExporter.cs b/Tools/ConfigBuilder/NBConfigBuilder/Exporter/ExcelExporter.cs index b021e9f..fc0e943 100644 --- a/Tools/ConfigBuilder/NBConfigBuilder/Exporter/ExcelExporter.cs +++ b/Tools/ConfigBuilder/NBConfigBuilder/Exporter/ExcelExporter.cs @@ -21,27 +21,14 @@ public sealed class ExcelExporter public ExportType ExportType; private readonly string _excelProgramPath; private readonly string _versionFilePath; - - // private readonly string _excelClientFileDirectory; - // private readonly string _excelServerFileDirectory; - // private readonly string _excelServerJsonDirectory; - // private readonly string _excelClientJsonDirectory; - - public VersionInfo VersionInfo; // 存储 Excel 文件的版本信息。 + + // public VersionInfo VersionInfo; // 存储 Excel 文件的版本信息。 private readonly Regex _regexName = new Regex("^[a-zA-Z][a-zA-Z0-9_]*$"); // 用于验证 Excel 表名的正则表达式。 private readonly HashSet _loadFiles = [".xlsx", ".xlsm", ".csv"]; // 加载的支持文件扩展名。 - - private readonly OneToManyList - _tables = new OneToManyList(); // 存储 Excel 表及其导出信息。 - + private readonly ConcurrentDictionary _excelTables = new ConcurrentDictionary(); // 存储解析后的 Excel 表。 - - public readonly ConcurrentDictionary Worksheets = - new ConcurrentDictionary(); // 存储已加载的 Excel 工作表。 - - public readonly Dictionary IgnoreTable = new Dictionary(); // 存储以#开头的的表和路径 - + /// /// 导表支持的数据类型集合。 /// @@ -52,6 +39,9 @@ public sealed class ExcelExporter "short[]", "int[]", "long[]", "float[]", "string[]", "uint[]" ]; + // 进度报告回调 + private Action _progressCallback; + static ExcelExporter() { ExcelPackage.License.SetNonCommercialOrganization("Fantasy"); @@ -130,16 +120,31 @@ public sealed class ExcelExporter break; } } + } - // SerializerManager.Initialize(); + /// + /// 设置进度报告回调 + /// + /// 进度报告回调函数 + public void SetProgressCallback(Action callback) + { + _progressCallback = callback; } public void Run() { + ReportProgress("正在查找配置文件..."); Find(); + ReportProgress("正在解析配置表..."); Parsing(); - ExportToBinary(); - File.WriteAllText(_versionFilePath, JsonConvert.SerializeObject(VersionInfo)); + ReportProgress("正在导出JSON数据..."); + ExportToJson(); + ReportProgress("导出完成"); + } + + private void ReportProgress(string message) + { + _progressCallback?.Invoke(message); } /// @@ -147,10 +152,6 @@ public sealed class ExcelExporter /// private void Find() { - VersionInfo = File.Exists(_versionFilePath) - ? JsonConvert.DeserializeObject(File.ReadAllText(_versionFilePath)) - : new VersionInfo(); - var dir = new DirectoryInfo(_excelProgramPath); var excelFiles = dir.GetFiles("*", SearchOption.AllDirectories); @@ -159,6 +160,10 @@ public sealed class ExcelExporter return; } + + var tables = new List(); + + // var tables = new OneToManyList(); foreach (var excelFile in excelFiles) { // 过滤掉非指定后缀的文件 @@ -187,15 +192,12 @@ public sealed class ExcelExporter } // 如果文件名以#开头,那么这个文件夹下的所有文件都不导出 - if (excelName.StartsWith("#", StringComparison.Ordinal)) { - IgnoreTable.Add(excelName, fullName); continue; } // 如果文件夹名包含#,那么这个文件夹下的所有文件都不导出 - if (path.Contains("#", StringComparison.Ordinal)) { continue; @@ -207,79 +209,31 @@ public sealed class ExcelExporter continue; } - var exportInfo = new ExportInfo() - { - Name = excelName, FileInfo = excelFile - }; - - _tables.Add(excelName.Split('_')[0], exportInfo); + tables.Add(excelFile); } - var removeTables = new List(); - foreach (var (tableName, tableList) in _tables) - { - var isNeedExport = false; - - foreach (var exportInfo in tableList) - { - var key = HashCodeHelper.ComputeHash64(exportInfo.Name); - var timer = TimeHelper.Transition(exportInfo.FileInfo.LastWriteTime); - - if (!isNeedExport) - { - if (VersionInfo.Tables.TryGetValue(key, out var lastWriteTime)) - { - isNeedExport = lastWriteTime != timer; - } - else - { - isNeedExport = true; - } - } - - VersionInfo.Tables[key] = timer; - } - - if (!isNeedExport) - { - removeTables.Add(tableName); - } - } - - foreach (var removeTable in removeTables) - { - _tables.Remove(removeTable); - } - - foreach (var (_, exportInfo) in _tables) - { - exportInfo.Sort((x, y) => Compare(x.Name, y.Name, StringComparison.Ordinal)); - } - } - - /// - /// 生成配置文件 - /// - private void Parsing() - { var generateTasks = new List(); - foreach (var (tableName, tableList) in _tables) + foreach (var table in tables) { var task = Task.Run(() => { - var writeToClassTask = new List(); - var excelTable = new ExcelTable(tableName); - - // 筛选需要导出的列 - foreach (var exportInfo in tableList) + var worksheets = LoadExcel(table.FullName); + foreach (var worksheet in worksheets) { + var tableName = worksheet.Name; + if (tableName.Contains("#", StringComparison.Ordinal)) + { + continue; + } + + ReportProgress($"正在解析配置表: {table.Name} Sheet:{tableName}"); + var excelTable = new ExcelTable(worksheet); try { var serverColInfoList = new List(); var clientColInfoList = new List(); - var worksheet = LoadExcel(exportInfo.FileInfo.FullName, true); for (var col = 3; col <= worksheet.Columns.EndColumn; col++) { @@ -312,20 +266,20 @@ public sealed class ExcelExporter if (isExportServer && isExportClient & serverType != clientType) { Log.Info( - $"配置表 {exportInfo.Name} {col} 列 [{colName}] 客户端类型 {clientType} 和 服务端类型 {serverType} 不一致"); + $"配置表 {tableName} {col} 列 [{colName}] 客户端类型 {clientType} 和 服务端类型 {serverType} 不一致"); continue; } if (!ColTypeSet.Contains(serverType) || !ColTypeSet.Contains(clientType)) { Log.Info( - $"配置表 {exportInfo.Name} {col} 列 [{colName}] 客户端类型 {clientType}, 服务端类型 {serverType} 不合法"); + $"配置表 {tableName} {col} 列 [{colName}] 客户端类型 {clientType}, 服务端类型 {serverType} 不合法"); continue; } if (!_regexName.IsMatch(colName)) { - Log.Info($"配置表 {exportInfo.Name} {col} 列 [{colName}] 列名非法"); + Log.Info($"配置表 {tableName} {col} 列 [{colName}] 列名非法"); continue; } @@ -339,320 +293,355 @@ public sealed class ExcelExporter if (clientColInfoList.Count > 0) { - excelTable.ClientColInfos.Add(exportInfo.FileInfo.FullName, clientColInfoList); + excelTable.ClientColInfos.Add(tableName, clientColInfoList); } if (serverColInfoList.Count > 0) { - excelTable.ServerColInfos.Add(exportInfo.FileInfo.FullName, serverColInfoList); + excelTable.ServerColInfos.Add(tableName, serverColInfoList); } } catch (Exception e) { - Log.Error($"Config : {tableName}, Name : {exportInfo.Name}, Error : {e}"); + Log.Error($"Config : {tableName}, Name : {tableName}, Error : {e}"); } + + _excelTables.TryAdd(tableName, excelTable); } - - // 生成cs文件 - - if (App.Config.GenServer) - { - writeToClassTask.Add(Task.Run(() => - { - WriteToClass(excelTable.ServerColInfos, App.Config.ServerPath, true); - })); - } - - if (App.Config.GenClient) - { - writeToClassTask.Add(Task.Run(() => - { - WriteToClass(excelTable.ClientColInfos, App.Config.ClientPath, false); - })); - } - - Task.WaitAll(writeToClassTask.ToArray()); - _excelTables.TryAdd(tableName, excelTable); }); generateTasks.Add(task); } Task.WaitAll(generateTasks.ToArray()); - Console.WriteLine("build success==="); } /// - /// 把数据和实体类转换二进制导出到文件中 + /// 生成配置文件 /// - private void ExportToBinary() + private void Parsing() { - System.Reflection.Assembly dynamicServerAssembly = null; - System.Reflection.Assembly dynamicClientAssembly = null; - var exportToBinaryTasks = new List(); + var generateTasks = new List(); - if (App.Config.GenServer && - Directory.Exists(App.Config.ServerPath)) - { - dynamicServerAssembly = DynamicAssembly.Load(App.Config.ServerPath); - } - - if (App.Config.GenClient && - Directory.Exists(App.Config.ClientPath)) - { - dynamicClientAssembly = DynamicAssembly.Load(App.Config.ClientPath); - } - - foreach (var (tableName, tableList) in _tables) + foreach ((var tableName, ExcelTable excelTable) in _excelTables) { var task = Task.Run(() => { - DynamicConfigDataType serverDynamicInfo = null; - DynamicConfigDataType clientDynamicInfo = null; - - var idCheck = new HashSet(); - var excelTable = _excelTables[tableName]; - var csName = Path.GetFileNameWithoutExtension(tableName); + // 生成cs文件 + var writeToClassTask = new List(); + var table = excelTable; if (App.Config.GenServer) { - var serverColInfoCount = excelTable.ServerColInfos.Sum(d => d.Value.Count); - serverDynamicInfo = serverColInfoCount == 0 - ? null - : DynamicAssembly.GetDynamicInfo(dynamicServerAssembly, csName); + writeToClassTask.Add(Task.Run(() => + { + ReportProgress($"正在生成服务端CS文件: {tableName}"); + WriteToClass(table, true); + })); } if (App.Config.GenClient) { - var clientColInfoCount = excelTable.ClientColInfos.Sum(d => d.Value.Count); - clientDynamicInfo = clientColInfoCount == 0 - ? null - : DynamicAssembly.GetDynamicInfo(dynamicClientAssembly, csName); + writeToClassTask.Add(Task.Run(() => + { + ReportProgress($"正在生成客户端CS文件: {tableName}"); + WriteToClass(table, false); + })); } - for (var i = 0; i < tableList.Count; i++) - { - var tableListName = tableList[i]; - - try - { - var fileInfoFullName = tableListName.FileInfo.FullName; - var excelWorksheet = LoadExcel(fileInfoFullName, false); - var rows = excelWorksheet.Dimension.Rows; - excelTable.ServerColInfos.TryGetValue(fileInfoFullName, out var serverCols); - excelTable.ClientColInfos.TryGetValue(fileInfoFullName, out var clientCols); - - for (var row = 7; row <= rows; row++) - { - if (excelWorksheet.GetCellValue(row, 1).StartsWith("#", StringComparison.Ordinal)) - { - continue; - } - - var id = excelWorksheet.GetCellValue(row, 3); - - if (idCheck.Contains(id)) - { - Log.Info($"{tableListName.Name} 存在重复Id {id} 行号 {row}"); - continue; - } - - idCheck.Add(id); - var isLast = row == rows && (i == tableList.Count - 1); - - if (App.Config.GenServer) - { - GenerateBinary(fileInfoFullName, excelWorksheet, serverDynamicInfo, serverCols, id, row, - isLast, true); - } - - if (App.Config.GenClient) - { - GenerateBinary(fileInfoFullName, excelWorksheet, clientDynamicInfo, clientCols, id, row, - isLast, false); - } - } - } - catch (Exception e) - { - Log.Error($"Table:{tableListName} error! \n{e}"); - throw; - } - } - - if (serverDynamicInfo?.ConfigData != null) - { - // var memoryStream = new MemoryStreamBuffer(); - // SerializerManager.GetSerializer(FantasySerializerType.ProtoBuf) - // .Serialize(serverDynamicInfo.ConfigData, memoryStream); - // if (!Directory.Exists(_excelServerBinaryDirectory)) - // { - // Directory.CreateDirectory(_excelServerBinaryDirectory); - // } - - // var asSpan = memoryStream.GetBuffer().AsSpan(0, (int)memoryStream.Position); - // File.WriteAllBytes(Path.Combine(_excelServerBinaryDirectory, $"{csName}Data.bytes"), - // asSpan.ToArray()); - - if (serverDynamicInfo.Json.Length > 0) - { - if (!Directory.Exists(App.Config.ServerJsonPath)) - { - Directory.CreateDirectory(App.Config.ServerJsonPath); - } - - using var sw = new StreamWriter(Path.Combine(App.Config.ServerJsonPath, $"{csName}Data.Json")); - sw.WriteLine("{\"List\":["); - sw.Write(serverDynamicInfo.Json.ToString()); - sw.WriteLine("]}"); - } - } - - if (clientDynamicInfo?.ConfigData != null) - { - // var memoryStream = new MemoryStreamBuffer(); - // SerializerManager.GetSerializer(FantasySerializerType.ProtoBuf) - // .Serialize(clientDynamicInfo.ConfigData, memoryStream); - // if (!Directory.Exists(_excelClientBinaryDirectory)) - // { - // Directory.CreateDirectory(_excelClientBinaryDirectory); - // } - // - // var asSpan = memoryStream.GetBuffer().AsSpan(0, (int)memoryStream.Position); - // File.WriteAllBytes(Path.Combine(_excelClientBinaryDirectory, $"{csName}Data.bytes"), - // asSpan.ToArray()); - - if (clientDynamicInfo.Json.Length > 0) - { - if (!Directory.Exists(App.Config.ClientJsonPath)) - { - Directory.CreateDirectory(App.Config.ClientJsonPath); - } - - using var sw = new StreamWriter(Path.Combine(App.Config.ClientJsonPath, $"{csName}Data.Json")); - sw.WriteLine("{\"List\":["); - sw.Write(clientDynamicInfo.Json.ToString()); - sw.WriteLine("]}"); - } - } + Task.WaitAll(writeToClassTask.ToArray()); }); - exportToBinaryTasks.Add(task); + + generateTasks.Add(task); } - Task.WaitAll(exportToBinaryTasks.ToArray()); + Task.WaitAll(generateTasks.ToArray()); + Console.WriteLine("build cs success==="); } - private void GenerateBinary(string fileInfoFullName, ExcelWorksheet excelWorksheet, - DynamicConfigDataType dynamicInfo, List cols, string id, int row, bool isLast, bool isServer) + #region json + + private Dictionary>> _clientTableJsonDictionary = + new Dictionary>>(); + + private Dictionary>> _serverTableJsonDictionary = + new Dictionary>>(); + + /// + /// 把数据生成json + /// + private void ExportToJson() { - if (cols == null || IsNullOrEmpty(id) || cols.Count <= 0 || dynamicInfo?.ConfigType == null) + _clientTableJsonDictionary.Clear(); + _serverTableJsonDictionary.Clear(); + foreach (var (tableName, excelTable) in _excelTables) { - return; - } - - var config = DynamicAssembly.CreateInstance(dynamicInfo.ConfigType); - - for (var i = 0; i < cols.Count; i++) - { - string colType; - var colIndex = cols[i]; - var colName = excelWorksheet.GetCellValue(5, colIndex); - var value = excelWorksheet.GetCellValue(row, colIndex); - - if (isServer) + // 示例:客户端JSON导出 + if (App.Config.GenClient && excelTable.ClientColInfos.Count > 0) { - colType = excelWorksheet.GetCellValue(1, colIndex); - - if (IsNullOrEmpty(colType) || colType == "0") - { - colType = excelWorksheet.GetCellValue(2, colIndex); - } - } - else - { - colType = excelWorksheet.GetCellValue(2, colIndex); + ReportProgress($"正在生成客户端JSON文件: {tableName}"); + ExportTableToJson(excelTable, excelTable.ClientColInfos, _clientTableJsonDictionary); } - try + // 示例:服务端JSON导出 + if (App.Config.GenServer && excelTable.ServerColInfos.Count > 0) { - SetNewValue(dynamicInfo.ConfigType.GetProperty(colName), config, colType, value); - } - catch (Exception e) - { - Log.Error( - $"Error Table {fileInfoFullName} Col:{colName} colType:{colType} Row:{row} value:{value} {e}"); - throw; + ReportProgress($"正在生成服务端JSON文件: {tableName}"); + ExportTableToJson(excelTable, excelTable.ServerColInfos, _serverTableJsonDictionary); } } - dynamicInfo.Method.Invoke(dynamicInfo.Obj, new object[] { config }); - - var json = JsonConvert.SerializeObject(config); - - if (isLast) + if (_clientTableJsonDictionary.Count > 0) { - dynamicInfo.Json.AppendLine(json); + ReportProgress("正在写入客户端JSON文件: configs.json"); + var json = JsonConvert.SerializeObject(_clientTableJsonDictionary, Formatting.Indented); + File.WriteAllText(Path.Combine(App.Config.ClientJsonPath, $"configs.json"), json); } - else + + if (_serverTableJsonDictionary.Count > 0) { - dynamicInfo.Json.AppendLine($"{json},"); + ReportProgress("正在写入服务端JSON文件: configs.json"); + var json = JsonConvert.SerializeObject(_serverTableJsonDictionary, Formatting.Indented); + File.WriteAllText(Path.Combine(App.Config.ServerJsonPath, $"configs.json"), json); } } + private void ExportTableToJson(ExcelTable table, TableDictionary colInfos, + Dictionary>> dictionary) + { + var result = new List>(); + + var worksheet = table.Sheet; + foreach (var (fileName, columns) in colInfos) + { + // 从第7行开始读取数据(前6行为表头) + for (int row = 7; row <= worksheet.Rows.EndRow; row++) + { + // 检查是否为空行 + bool isEmptyRow = true; + foreach (var col in columns) + { + var cellValue = worksheet.GetCellValue(row, col); + if (!IsNullOrEmpty(cellValue)) + { + isEmptyRow = false; + break; + } + } + + // 如果整行都为空,则停止处理 + if (isEmptyRow) + { + break; + } + + var rowData = new Dictionary(); + + foreach (var col in columns) + { + var columnName = worksheet.GetCellValue(5, col); + var cellValue = worksheet.GetCellValue(row, col); + // 可在此处做类型转换 + var columnType = GetColumnType(worksheet, col); // 需要实现获取列类型的方法 + rowData[columnName] = ConvertCellValue(cellValue, columnType); + } + + result.Add(rowData); + } + } + + dictionary[table.Name] = result; + } + + private string GetColumnType(ExcelWorksheet worksheet, int column) + { + var serverType = worksheet.GetCellValue(1, column); + var clientType = worksheet.GetCellValue(2, column); + + // 根据实际情况确定使用哪个类型,这里简化处理 + return !string.IsNullOrEmpty(serverType) && serverType != "0" ? serverType : clientType; + } + + private object ConvertCellValue(string cellValue, string targetType) + { + if (string.IsNullOrEmpty(cellValue)) + { + // 返回默认值 + if (targetType.EndsWith("[]")) + { + var elementType = targetType.Substring(0, targetType.Length - 2); + return Array.CreateInstance(Type.GetType(elementType) ?? typeof(object), 0); + } + + return GetDefaultValue(targetType); + } + + // 处理数组类型 + if (targetType.EndsWith("[]")) + { + var elementType = targetType.Substring(0, targetType.Length - 2); + var values = cellValue.Split(','); + + switch (elementType) + { + case "short": + return values.Select(v => + { + short result; + return short.TryParse(v, out result) ? result : (short)0; + }).ToArray(); + + case "ushort": + return values.Select(v => + { + ushort result; + return ushort.TryParse(v, out result) ? result : (ushort)0; + }).ToArray(); + + case "int": + return values.Select(v => + { + int result; + return int.TryParse(v, out result) ? result : 0; + }).ToArray(); + + case "uint": + return values.Select(v => + { + uint result; + return uint.TryParse(v, out result) ? result : 0u; + }).ToArray(); + + case "long": + return values.Select(v => + { + long result; + return long.TryParse(v, out result) ? result : 0L; + }).ToArray(); + + case "ulong": + return values.Select(v => + { + ulong result; + return ulong.TryParse(v, out result) ? result : 0UL; + }).ToArray(); + + case "bool": + return values.Select(v => + { + bool result; + return bool.TryParse(v, out result) ? result : false; + }).ToArray(); + + case "string": + return values.Select(v => v.Trim()).ToArray(); + + default: + return values; + } + } + + // 处理单个值 + switch (targetType) + { + case "short": + short shortResult; + return short.TryParse(cellValue, out shortResult) ? shortResult : (short)0; + + case "ushort": + ushort ushortResult; + return ushort.TryParse(cellValue, out ushortResult) ? ushortResult : (ushort)0; + + case "int": + int intResult; + return int.TryParse(cellValue, out intResult) ? intResult : 0; + + case "uint": + uint uintResult; + return uint.TryParse(cellValue, out uintResult) ? uintResult : 0u; + + case "long": + long longResult; + return long.TryParse(cellValue, out longResult) ? longResult : 0L; + + case "ulong": + ulong ulongResult; + return ulong.TryParse(cellValue, out ulongResult) ? ulongResult : 0UL; + + case "bool": + bool boolResult; + if (bool.TryParse(cellValue, out boolResult)) + { + return boolResult; + } + else + { + int numericBool; + return int.TryParse(cellValue, out numericBool) ? numericBool != 0 : false; + } + + case "string": + return cellValue; + + default: + return cellValue; + } + } + + private object GetDefaultValue(string type) + { + switch (type) + { + case "short": return (short)0; + case "ushort": return (ushort)0; + case "int": return 0; + case "uint": return 0u; + case "long": return 0L; + case "ulong": return 0UL; + case "bool": return false; + case "string": return ""; + case "short[]": return new short[0]; + case "ushort[]": return new ushort[0]; + case "int[]": return new int[0]; + case "uint[]": return new uint[0]; + case "long[]": return new long[0]; + case "ulong[]": return new ulong[0]; + case "bool[]": return new bool[0]; + case "string[]": return new string[0]; + default: return null; + } + } + + #endregion /// /// 从 Excel 文件加载工作表并返回 ExcelWorksheet 对象。 /// /// 工作表的名称或文件路径。 - /// 是否将加载的工作表添加到缓存字典中。 /// 表示 Excel 工作表的 ExcelWorksheet 对象。 - public ExcelWorksheet LoadExcel(string name, bool isAddToDic) + public List LoadExcel(string name) { - if (Worksheets.TryGetValue(name, out var worksheet)) - { - return worksheet; - } - var workbookWorksheets = ExcelHelper.LoadExcel(name).Workbook.Worksheets; - worksheet = workbookWorksheets[0]; - - if (isAddToDic) - { - Worksheets.TryAdd(name, worksheet); - - foreach (var workbookWorksheet in workbookWorksheets) - { - try - { - var hash = HashCodeHelper.ComputeHash64(workbookWorksheet.Name); - VersionInfo.WorksheetNames.Add(hash); - } - catch (Exception e) - { - Console.WriteLine(e); - } - - Worksheets.TryAdd(workbookWorksheet.Name, workbookWorksheet); - } - } - - Log.Info(name); - return workbookWorksheets[0]; + return workbookWorksheets.ToList(); } /// /// 写入到cs /// - /// - /// + /// /// - private void WriteToClass(TableDictionary colInfos, string exportPath, bool isServer) + private void WriteToClass(ExcelTable table, bool isServer) { + var colInfos = isServer ? table.ServerColInfos : table.ClientColInfos; + var exportPath = isServer ? App.Config.ServerPath : App.Config.ClientPath; + if (colInfos.Count <= 0) { return; } + var excelWorksheet = table.Sheet; + var index = 0; var fileBuilder = new StringBuilder(); var colNameSet = new HashSet(); @@ -671,19 +660,16 @@ public sealed class ExcelExporter continue; } - var excelWorksheet = LoadExcel(tableName, false); foreach (var colIndex in cols) { var colName = excelWorksheet.GetCellValue(5, colIndex); - if (colNameSet.Contains(colName)) + if (!colNameSet.Add(colName)) { continue; } - colNameSet.Add(colName); - string colType; if (isServer) @@ -744,197 +730,6 @@ public sealed class ExcelExporter } } - private void SetNewValue(PropertyInfo propertyInfo, object config, string type, string value) - { - if (IsNullOrWhiteSpace(value)) - { - return; - } - - switch (type) - { - case "short": - { - propertyInfo.SetValue(config, Convert.ToInt16(value)); - return; - } - case "ushort": - { - propertyInfo.SetValue(config, Convert.ToUInt16(value)); - return; - } - case "uint": - { - propertyInfo.SetValue(config, Convert.ToUInt32(value)); - return; - } - case "int": - { - propertyInfo.SetValue(config, Convert.ToInt32(value)); - return; - } - case "decimal": - { - propertyInfo.SetValue(config, Convert.ToDecimal(value)); - return; - } - case "string": - { - try - { - propertyInfo.SetValue(config, value); - } - catch (Exception e) - { - Console.WriteLine(e); - throw; - } - - return; - } - case "bool": - { - // 空字符串 - - value = value.ToLower(); - - if (IsNullOrEmpty(value)) - { - propertyInfo.SetValue(config, false); - } - else if (bool.TryParse(value, out bool b)) - { - propertyInfo.SetValue(config, b); - } - else if (int.TryParse(value, out int v)) - { - propertyInfo.SetValue(config, v != 0); - } - else - { - propertyInfo.SetValue(config, false); - } - - return; - } - case "ulong": - { - propertyInfo.SetValue(config, Convert.ToUInt64(value)); - return; - } - case "long": - { - propertyInfo.SetValue(config, Convert.ToInt64(value)); - return; - } - case "double": - { - propertyInfo.SetValue(config, Convert.ToDouble(value)); - return; - } - case "float": - { - propertyInfo.SetValue(config, Convert.ToSingle(value)); - return; - } - case "int32[]": - case "int[]": - { - if (value != "0") - { - propertyInfo.SetValue(config, value.Split(",").Select(d => Convert.ToInt32(d)).ToArray()); - } - - return; - } - case "uint[]": - { - if (value != "0") - { - propertyInfo.SetValue(config, value.Split(",").Select(d => Convert.ToUInt32(d)).ToArray()); - } - - return; - } - case "long[]": - { - if (value != "0") - { - propertyInfo.SetValue(config, value.Split(",").Select(d => Convert.ToInt64(d)).ToArray()); - } - - return; - } - case "double[]": - { - if (value != "0") - { - propertyInfo.SetValue(config, value.Split(",").Select(d => Convert.ToDouble(d)).ToArray()); - } - - return; - } - case "string[]": - { - if (value == "0") - { - return; - } - - var list = value.Split(",").ToArray(); - - for (var i = 0; i < list.Length; i++) - { - list[i] = list[i].Replace("\"", ""); - } - - propertyInfo.SetValue(config, value.Split(",").ToArray()); - - return; - } - case "float[]": - { - if (value != "0") - { - propertyInfo.SetValue(config, value.Split(",").Select(d => Convert.ToSingle(d)).ToArray()); - } - - return; - } - case "IntDictionaryConfig": - { - if (value.Trim() == "" || value.Trim() == "{}") - { - propertyInfo.SetValue(config, null); - return; - } - - var attr = new IntDictionaryConfig { Dic = JsonConvert.DeserializeObject>(value) }; - - propertyInfo.SetValue(config, attr); - - return; - } - case "StringDictionaryConfig": - { - if (value.Trim() == "" || value.Trim() == "{}") - { - propertyInfo.SetValue(config, null); - return; - } - - var attr = new StringDictionaryConfig - { Dic = JsonConvert.DeserializeObject>(value) }; - - propertyInfo.SetValue(config, attr); - - return; - } - default: - throw new NotSupportedException($"不支持此类型: {type}"); - } - } - private bool IsArray(string type, out string t) { t = null; diff --git a/Tools/ConfigBuilder/NBConfigBuilder/Exporter/ExcelTable.cs b/Tools/ConfigBuilder/NBConfigBuilder/Exporter/ExcelTable.cs index 20f0558..dd5a525 100644 --- a/Tools/ConfigBuilder/NBConfigBuilder/Exporter/ExcelTable.cs +++ b/Tools/ConfigBuilder/NBConfigBuilder/Exporter/ExcelTable.cs @@ -1,3 +1,5 @@ +using OfficeOpenXml; + namespace NBConfigBuilder; /// @@ -9,20 +11,29 @@ public sealed class ExcelTable /// 表格的名称。 /// public readonly string Name; + /// /// 客户端列信息,使用排序字典存储列名和列索引列表。 /// public readonly SortedDictionary> ClientColInfos = new(); + /// /// 服务器端列信息,使用排序字典存储列名和列索引列表。 /// public readonly SortedDictionary> ServerColInfos = new(); + + /// + /// 表数据 + /// + public readonly ExcelWorksheet Sheet; + /// /// 构造函数,初始化Excel表格对象并设置表格名称。 /// - /// 表格名称。 - public ExcelTable(string name) + /// 表格。 + public ExcelTable(ExcelWorksheet sheet) { - Name = name; + Name = sheet.Name; + Sheet = sheet; } } \ No newline at end of file diff --git a/Tools/ConfigBuilder/NBConfigBuilder/Exporter/ExcelTemplate.cs b/Tools/ConfigBuilder/NBConfigBuilder/Exporter/ExcelTemplate.cs index c3f67ff..d12466e 100644 --- a/Tools/ConfigBuilder/NBConfigBuilder/Exporter/ExcelTemplate.cs +++ b/Tools/ConfigBuilder/NBConfigBuilder/Exporter/ExcelTemplate.cs @@ -10,8 +10,13 @@ public static class ExcelTemplate using System.Reflection; using System.Collections.Generic; using System.Collections.Concurrent; + #if FANTASY_NET using Fantasy.ConfigTable; using Fantasy.Serialize; + #else + using NBC; + using NBC.Serialize; + #endif // ReSharper disable CollectionNeverUpdated.Global // ReSharper disable UnusedAutoPropertyAccessor.Global #pragma warning disable CS1591 // Missing XML comment for publicly visible type or member diff --git a/Tools/ConfigBuilder/NBConfigBuilder/Exporter/ExcelWorksheets.cs b/Tools/ConfigBuilder/NBConfigBuilder/Exporter/ExcelWorksheets.cs index cf4277a..1c23c40 100644 --- a/Tools/ConfigBuilder/NBConfigBuilder/Exporter/ExcelWorksheets.cs +++ b/Tools/ConfigBuilder/NBConfigBuilder/Exporter/ExcelWorksheets.cs @@ -1,22 +1,22 @@ -using OfficeOpenXml; - -namespace NBConfigBuilder; - -public sealed class ExcelWorksheets(ExcelExporter excelExporter) -{ - public bool TryGetValue(string worksheetName, out ExcelWorksheet excelWorksheet) - { - if (excelExporter.Worksheets.TryGetValue(worksheetName, out excelWorksheet)) - { - return true; - } - - var computeHash64 = HashCodeHelper.ComputeHash64(worksheetName); - if (!excelExporter.VersionInfo.WorksheetNames.Contains(computeHash64)) - { - Log.Info($"{worksheetName} is not exist!"); - } - - return false; - } -} \ No newline at end of file +// using OfficeOpenXml; +// +// namespace NBConfigBuilder; +// +// public sealed class ExcelWorksheets(ExcelExporter excelExporter) +// { +// public bool TryGetValue(string worksheetName, out ExcelWorksheet excelWorksheet) +// { +// if (excelExporter.Worksheets.TryGetValue(worksheetName, out excelWorksheet)) +// { +// return true; +// } +// +// var computeHash64 = HashCodeHelper.ComputeHash64(worksheetName); +// if (!excelExporter.VersionInfo.WorksheetNames.Contains(computeHash64)) +// { +// Log.Info($"{worksheetName} is not exist!"); +// } +// +// return false; +// } +// } \ No newline at end of file diff --git a/Tools/ConfigBuilder/NBConfigBuilder/Exporter/ExportInfo.cs b/Tools/ConfigBuilder/NBConfigBuilder/Exporter/ExportInfo.cs deleted file mode 100644 index d9d7b91..0000000 --- a/Tools/ConfigBuilder/NBConfigBuilder/Exporter/ExportInfo.cs +++ /dev/null @@ -1,17 +0,0 @@ -#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. -namespace NBConfigBuilder; - -/// -/// 导出信息类,用于存储导出操作的名称和文件信息。 -/// -public class ExportInfo -{ - /// - /// 导出操作的名称。 - /// - public string Name; - /// - /// 导出操作生成的文件信息。 - /// - public FileInfo FileInfo; -} \ No newline at end of file diff --git a/Tools/ConfigBuilder/NBConfigBuilder/Form1.Designer.cs b/Tools/ConfigBuilder/NBConfigBuilder/Form1.Designer.cs index b1a50ee..43061d6 100644 --- a/Tools/ConfigBuilder/NBConfigBuilder/Form1.Designer.cs +++ b/Tools/ConfigBuilder/NBConfigBuilder/Form1.Designer.cs @@ -100,7 +100,7 @@ checkBoxGenClient.Name = "checkBoxGenClient"; checkBoxGenClient.Size = new Size(87, 21); checkBoxGenClient.TabIndex = 5; - checkBoxGenClient.Text = "生产服务端"; + checkBoxGenClient.Text = "生成客户端"; checkBoxGenClient.UseVisualStyleBackColor = true; // // label2 @@ -137,7 +137,7 @@ checkBoxGenServer.Name = "checkBoxGenServer"; checkBoxGenServer.Size = new Size(87, 21); checkBoxGenServer.TabIndex = 9; - checkBoxGenServer.Text = "生产客户端"; + checkBoxGenServer.Text = "生成服务端"; checkBoxGenServer.UseVisualStyleBackColor = true; // // buttonSelectServerPath diff --git a/Tools/ConfigBuilder/NBConfigBuilder/Form1.cs b/Tools/ConfigBuilder/NBConfigBuilder/Form1.cs index c41e3c9..cf7eacc 100644 --- a/Tools/ConfigBuilder/NBConfigBuilder/Form1.cs +++ b/Tools/ConfigBuilder/NBConfigBuilder/Form1.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using System.Threading.Tasks; namespace NBConfigBuilder { @@ -7,6 +8,9 @@ namespace NBConfigBuilder // 配置文件路径 private readonly string configPath = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath) ?? string.Empty, "config.json"); + + // 保存原始标题 + private string _originalTitle; public Form1() { @@ -14,16 +18,64 @@ namespace NBConfigBuilder // 设置窗口大小不可变 this.FormBorderStyle = FormBorderStyle.FixedSingle; this.MaximizeBox = false; + + // 保存原始标题 + _originalTitle = this.Text; // 加载保存的配置 LoadConfig(); } - private void buttonRun_Click(object sender, EventArgs e) + private async void buttonRun_Click(object sender, EventArgs e) { - // 保存当前配置 - SaveConfig(); - new ExcelExporter(ExportType.AllExcel).Run(); + // 禁用按钮防止重复点击 + buttonRun.Enabled = false; + buttonRun.Text = "执行中..."; + + try + { + // 保存当前配置 + SaveConfig(); + + // 创建导出器并设置进度回调 + var exporter = new ExcelExporter(ExportType.AllExcel); + exporter.SetProgressCallback(UpdateProgress); + + // 运行导出器 + await Task.Run(() => exporter.Run()); + + // 显示成功消息 + MessageBox.Show("配置导出完成!", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + catch (Exception ex) + { + // 显示错误消息 + MessageBox.Show($"导出过程中发生错误:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + finally + { + // 恢复按钮状态和标题 + buttonRun.Enabled = true; + buttonRun.Text = "执行"; + this.Text = _originalTitle; + } + } + + /// + /// 更新进度显示 + /// + /// 进度消息 + private void UpdateProgress(string message) + { + // 确保在UI线程上更新界面 + if (InvokeRequired) + { + Invoke(new Action(UpdateProgress), message); + return; + } + + // 更新标题栏显示进度 + this.Text = $"{_originalTitle} - {message}"; } private void buttonSelectExcelPath_Click(object sender, EventArgs e)