7 changed files with 129 additions and 25 deletions
@ -1,15 +0,0 @@ |
|||||||
using UnityEditor; |
|
||||||
using UnityEngine; |
|
||||||
|
|
||||||
namespace Tools.ExcelResolver.Editor |
|
||||||
{ |
|
||||||
public sealed partial class ExcelResolverEditorWindow |
|
||||||
{ |
|
||||||
private void CreateSO(ClassCodeData classCodeData) |
|
||||||
{ |
|
||||||
var so = ScriptableObject.CreateInstance(classCodeData.className + "SO"); |
|
||||||
AssetDatabase.CreateAsset(so, $"{excelResolverConfig.SOPathRoot}/{classCodeData.className}SO.asset"); |
|
||||||
AssetDatabase.SaveAssets(); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -0,0 +1,65 @@ |
|||||||
|
using System; |
||||||
|
using System.IO; |
||||||
|
using OfficeOpenXml; |
||||||
|
using UnityEditor; |
||||||
|
using UnityEngine; |
||||||
|
|
||||||
|
namespace Tools.ExcelResolver.Editor |
||||||
|
{ |
||||||
|
public sealed partial class ExcelResolverEditorWindow |
||||||
|
{ |
||||||
|
private void WriteSOData(ExcelWorksheet worksheet, ClassCodeData classCodeData) |
||||||
|
{ |
||||||
|
ScriptableObject instance; |
||||||
|
Type soType = ExcelResolverUtil.GetOrCacheTypeByName(classCodeData.className); |
||||||
|
|
||||||
|
if (soType == null) |
||||||
|
{ |
||||||
|
Debug.LogError($"Class '{classCodeData.className}SO' not found. Please generate classes first (or check namespace)."); |
||||||
|
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(); |
||||||
|
} |
||||||
|
|
||||||
|
for (int row = 7; row < worksheet.Dimension.End.Row; row++) |
||||||
|
{ |
||||||
|
// 跳过注释行 |
||||||
|
if (worksheet.Cells[row, 1].Text == "##") continue; |
||||||
|
|
||||||
|
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(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,54 @@ |
|||||||
|
using System; |
||||||
|
using System.Collections.Generic; |
||||||
|
|
||||||
|
namespace Tools.ExcelResolver.Editor |
||||||
|
{ |
||||||
|
public static class ExcelResolverUtil |
||||||
|
{ |
||||||
|
/// <summary> |
||||||
|
/// 类型缓存,避免重复反射查找 |
||||||
|
/// </summary> |
||||||
|
public static readonly Dictionary<string, Type> TypeCache = new(StringComparer.OrdinalIgnoreCase); |
||||||
|
|
||||||
|
/// <summary> |
||||||
|
/// 通过类名(含命名空间)获取 Type,并缓存 |
||||||
|
/// </summary> |
||||||
|
public static Type GetOrCacheTypeByName(string typeName) |
||||||
|
{ |
||||||
|
if (TypeCache.TryGetValue(typeName, out Type cachedType)) |
||||||
|
{ |
||||||
|
return cachedType; |
||||||
|
} |
||||||
|
|
||||||
|
string namespacedType = $"Tools.ExcelResolver.{typeName}"; |
||||||
|
Type type = Type.GetType(namespacedType, false, true) ?? GetTypeFromAllAssemblies(namespacedType); |
||||||
|
|
||||||
|
if (type != null) |
||||||
|
{ |
||||||
|
TypeCache[typeName] = type; |
||||||
|
} |
||||||
|
|
||||||
|
return type; |
||||||
|
} |
||||||
|
|
||||||
|
public static Type GetTypeFromAllAssemblies(string typeName) |
||||||
|
{ |
||||||
|
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) |
||||||
|
{ |
||||||
|
var type = assembly.GetType(typeName); |
||||||
|
if (type != null) |
||||||
|
{ |
||||||
|
TypeCache[typeName] = type; |
||||||
|
return type; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
throw new ArgumentException($"Unsupported type: {typeName}"); |
||||||
|
} |
||||||
|
|
||||||
|
public static void Dispose() |
||||||
|
{ |
||||||
|
TypeCache.Clear(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue