From 4553f12a917a40c0779ed48592ad5d929d1416eb Mon Sep 17 00:00:00 2001
From: coffee <985942825@qq.com>
Date: Sun, 5 Jan 2025 21:31:22 +0800
Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../ExcelResolverEditorWindow.ReadExcel.cs | 4 +-
...ExcelResolverEditorWindow.WriteDataCode.cs | 6 +-
.../ExcelResolverEditorWindow.WriteSOData.cs | 46 ++----
...xcelResolverEditorWindow.WriteUtilCode.cs} | 4 +-
...esolverEditorWindow.WriteUtilCode.cs.meta} | 0
.../Editor/ExcelResolverEditorWindow.cs | 24 ++-
.../Editor/ExcelResolverUtil.Cell.cs | 140 ++++++++++++++++++
.../Editor/ExcelResolverUtil.Cell.cs.meta | 3 +
...olverUtil.cs => ExcelResolverUtil.Type.cs} | 2 +-
...cs.meta => ExcelResolverUtil.Type.cs.meta} | 0
10 files changed, 179 insertions(+), 50 deletions(-)
rename Assets/Unity-Tools/Core/ExcelResolver/Editor/{ExcelResolverEditorWindow.WriteSOCode.cs => ExcelResolverEditorWindow.WriteUtilCode.cs} (97%)
rename Assets/Unity-Tools/Core/ExcelResolver/Editor/{ExcelResolverEditorWindow.WriteSOCode.cs.meta => ExcelResolverEditorWindow.WriteUtilCode.cs.meta} (100%)
create mode 100644 Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.Cell.cs
create mode 100644 Assets/Unity-Tools/Core/ExcelResolver/Editor/ExcelResolverUtil.Cell.cs.meta
rename Assets/Unity-Tools/Core/ExcelResolver/Editor/{ExcelResolverUtil.cs => ExcelResolverUtil.Type.cs} (96%)
rename Assets/Unity-Tools/Core/ExcelResolver/Editor/{ExcelResolverUtil.cs.meta => ExcelResolverUtil.Type.cs.meta} (100%)
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