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