diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs index 67cc16b..728397e 100644 --- a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs @@ -36,9 +36,9 @@ namespace Tools.ExcelResolver.Editor WriteDataCode(classCodeData); WriteSOCode(classCodeData); - WriteSOData(worksheet, classCodeData); + // WriteSOData(worksheet, classCodeData); } - + AssetDatabase.Refresh(); } private TableType CheckTableType(ExcelWorksheet worksheet, out int[] keyIndex) diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataCode.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataCode.cs index ed2c3e8..2232f26 100644 --- a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataCode.cs +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteDataCode.cs @@ -48,7 +48,11 @@ namespace Tools.ExcelResolver.Editor { new CodeAttributeDeclaration("Serializable") }, - BaseTypes = { new CodeTypeReference("IExcelData") } + BaseTypes = + { + new CodeTypeReference("ScriptableObject"), + new CodeTypeReference("IExcelData") + } }; codeNamespace.Types.Add(classType); diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs index 88ee065..b498415 100644 --- a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOData.cs @@ -10,7 +10,6 @@ namespace Tools.ExcelResolver.Editor { private void WriteSOData(ExcelWorksheet worksheet, ClassCodeData classCodeData) { - ScriptableObject instance; Type soType = ExcelResolverUtil.GetOrCacheTypeByName(classCodeData.className); if (soType == null) @@ -19,44 +18,29 @@ namespace Tools.ExcelResolver.Editor return; } - string fullPath = $"{excelResolverConfig.SOPathRoot}/{classCodeData.className}SO.asset"; - - if (File.Exists(fullPath)) - { - Debug.Log("已存在SO文件,无需创建"); - - } - else - { - instance = ScriptableObject.CreateInstance(soType); - AssetDatabase.CreateAsset(instance, $"{excelResolverConfig.SOPathRoot}/{classCodeData.className}SO.asset"); - AssetDatabase.SaveAssets(); - } + // string fullPath = $"{excelResolverConfig.SOPathRoot}/{classCodeData.className}SO.asset"; + // + // if (File.Exists(fullPath)) + // { + // Debug.Log("已存在SO文件,无需创建"); + // + // } + // else + // { + // instance = ScriptableObject.CreateInstance(soType); + // AssetDatabase.CreateAsset(instance, $"{excelResolverConfig.SOPathRoot}/{classCodeData.className}SO.asset"); + // AssetDatabase.SaveAssets(); + // } for (int row = 7; row < worksheet.Dimension.End.Row; row++) { // 跳过注释行 if (worksheet.Cells[row, 1].Text == "##") continue; + + ScriptableObject instance = ScriptableObject.CreateInstance(soType); for (int col = 2; col < worksheet.Dimension.End.Column; col++) { - var keyText = worksheet.Cells[row, classCodeData.keyField[0].colIndex].Text; - switch (classCodeData.tableType) - { - case TableType.SingleKeyTable: - - break; - case TableType.UnionMultiKeyTable: - break; - case TableType.MultiKeyTable: - break; - case TableType.NotKetTable: - break; - case TableType.ColumnTable: - break; - default: - throw new ArgumentOutOfRangeException(); - } } } diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOCode.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilCode.cs similarity index 97% rename from Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOCode.cs rename to Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilCode.cs index d38db62..07e76ad 100644 --- a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOCode.cs +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilCode.cs @@ -11,7 +11,7 @@ namespace Tools.ExcelResolver.Editor { private void WriteSOCode(ClassCodeData classCodeData) { - string outputPath = $"{excelResolverConfig.CodePathRoot}/{classCodeData.className}SO.cs"; + string outputPath = $"{excelResolverConfig.CodePathRoot}/{classCodeData.className}Util.cs"; CodeCompileUnit compileUnit = new CodeCompileUnit(); #region 命名空间 @@ -40,7 +40,7 @@ namespace Tools.ExcelResolver.Editor #region 类 - CodeTypeDeclaration classType = new CodeTypeDeclaration($"{classCodeData.className}SO") + CodeTypeDeclaration classType = new CodeTypeDeclaration($"{classCodeData.className}Util") { IsClass = true, TypeAttributes = System.Reflection.TypeAttributes.Public, diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOCode.cs.meta b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilCode.cs.meta similarity index 100% rename from Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteSOCode.cs.meta rename to Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.WriteUtilCode.cs.meta diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.cs index dd876ca..3069738 100644 --- a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.cs +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverEditorWindow.cs @@ -1,3 +1,4 @@ +using System; using Sirenix.OdinInspector; using Sirenix.OdinInspector.Editor; using Sirenix.Utilities; @@ -29,20 +30,17 @@ namespace Tools.ExcelResolver.Editor } } - // [OnInspectorGUI] - // private void DrawGenerateButton() - // { - // GUILayout.FlexibleSpace(); // 把空白区域推向上方 - // if (GUILayout.Button("Generate", GUILayout.Height(50))) - // { - // Generate(); - // } - // } - - [Button(ButtonSizes.Gigantic)] - private void Generate() + [OnInspectorGUI] + private void DrawGenerateButton() { - ReadExcel(); + GUILayout.FlexibleSpace(); // 把空白区域推向上方 } + + + [Button(ButtonSizes.Gigantic), HorizontalGroup("Split", 0.5f)] + private void GenerateCode() => ReadExcel(); + + [Button(ButtonSizes.Gigantic), HorizontalGroup("Split", 0.5f)] + private void GenerateSO() => ReadExcel(); } } \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.Cell.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.Cell.cs new file mode 100644 index 0000000..700dec6 --- /dev/null +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.Cell.cs @@ -0,0 +1,140 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using OfficeOpenXml; +using UnityEngine; + +namespace Tools.ExcelResolver.Editor +{ + public static partial class ExcelResolverUtil + { + /// + /// 读取指定行的数据 + /// + public static List ReadRow(ExcelWorksheet worksheet, int row, int colCount, string rowType) + { + List values = new(colCount); + for (int col = 1; col <= colCount; col++) + { + string value = worksheet.Cells[row, col].Text?.Trim(); + if (rowType == "headers" && string.IsNullOrEmpty(value)) + { + Debug.LogWarning( + $"Empty header found in worksheet '{worksheet.Name}', column {col}. Skipping this column."); + values.Add(string.Empty); + continue; + } + + if (rowType == "types" && string.IsNullOrEmpty(value)) + { + value = "string"; + Debug.LogWarning( + $"Empty type found for column '{worksheet.Cells[1, col].Text}' in worksheet '{worksheet.Name}'. Defaulting to 'string'."); + } + + values.Add(value); + } + return values; + } + + /// + /// 通用的单元格 -> C# 对象转换 + /// + public static object ConvertCellValue(ExcelRange cell, string type, string header, string className) + { + try + { + string cellValue = cell.Value?.ToString()?.Trim(); + + if (type.StartsWith("list<", StringComparison.OrdinalIgnoreCase) && type.EndsWith(">")) + { + return ConvertToList(cellValue, type, header, className); + } + else if (TypeConverters.TryGetValue(type, out var converter)) + { + return converter(cellValue); + } + else + { + Debug.LogError($"Unsupported type '{type}' for field '{header}' in class '{className}'."); + return GetDefaultValue(type); + } + } + catch (Exception ex) + { + Debug.LogError($"Error converting value for '{header}' in '{className}': {ex.Message}"); + return GetDefaultValue(type); + } + } + + /// + /// 返回类型的默认值 (包含 List<...> 场景) + /// + public static object GetDefaultValue(string type) + { + if (type.StartsWith("list<", StringComparison.OrdinalIgnoreCase) && type.EndsWith(">")) + { + var insideType = type.Substring(5, type.Length - 6).Trim(); + return insideType.ToLower() switch + { + "int" or "integer" => new List(), + "float" => new List(), + "double" => new List(), + "bool" or "boolean" => new List(), + "string" => new List(), + _ => null + }; + } + + return type.ToLower() switch + { + "int" or "integer" => 0, + "float" => 0f, + "double" => 0.0, + "bool" or "boolean" => false, + "string" => string.Empty, + _ => null, + }; + } + + /// + /// 转换逗号分隔的字符串到 List<...> (List, List, ...) + /// + public static object ConvertToList(string cellValue, string type, string header, string className) + { + var insideType = type.Substring(5, type.Length - 6).Trim(); + var splitted = string.IsNullOrEmpty(cellValue) + ? Array.Empty() + : cellValue.Split(','); + + return insideType.ToLower() switch + { + "int" or "integer" => splitted.Select(s => { + int.TryParse(s.Trim(), out var parsed); return parsed; + }).ToList(), + "float" => splitted.Select(s => { + float.TryParse(s.Trim(), out var parsed); return parsed; + }).ToList(), + "double" => splitted.Select(s => { + double.TryParse(s.Trim(), out var parsed); return parsed; + }).ToList(), + "bool" or "boolean" => splitted.Select(s => { + return bool.TryParse(s.Trim(), out var parsed) ? parsed : (s.Trim() == "1" || s.Trim().Equals("true", StringComparison.OrdinalIgnoreCase)); + }).ToList(), + "string" => splitted.Select(s => s.Trim()).ToList(), + _ => throw new Exception($"Unsupported list element type '{insideType}' for field '{header}' in class '{className}'.") + }; + } + + public static readonly Dictionary> TypeConverters = new(StringComparer.OrdinalIgnoreCase) + { + { "int", value => int.TryParse(value, out var intValue) ? intValue : 0 }, + { "float", value => float.TryParse(value, out var floatValue) ? floatValue : 0f }, + { "double", value => double.TryParse(value, out var doubleValue) ? doubleValue : 0.0 }, + { "bool", value => bool.TryParse(value, out var boolValue) + ? boolValue + : (value == "1" || value.Equals("true", StringComparison.OrdinalIgnoreCase)) }, + { "string", value => value ?? string.Empty } + }; + } +} \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.Cell.cs.meta b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.Cell.cs.meta new file mode 100644 index 0000000..35f968c --- /dev/null +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.Cell.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 44f4bfea1a574775841f162901455ee2 +timeCreated: 1736083579 \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.cs b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.Type.cs similarity index 96% rename from Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.cs rename to Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.Type.cs index 94231b8..a763e94 100644 --- a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.cs +++ b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.Type.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; namespace Tools.ExcelResolver.Editor { - public static class ExcelResolverUtil + public static partial class ExcelResolverUtil { /// /// 类型缓存,避免重复反射查找 diff --git a/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.cs.meta b/Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.Type.cs.meta similarity index 100% rename from Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.cs.meta rename to Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.Type.cs.meta