You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

137 lines
6.1 KiB

using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;
using OfficeOpenXml;
using Sirenix.OdinInspector;
using Tools.Editor;
using UnityEditor;
using UnityEngine;
namespace Tools.ExcelResolver.Editor
{
public sealed partial class ExcelResolverEditorWindow
{
[FoldoutGroup("Hide Setting")]
[ShowInInspector] private Dictionary<ExcelWorksheet, ClassCodeData> classCodeDataDict = new();
private void WriteDataSO()
{
foreach (var classCodeDataDictPair in classCodeDataDict)
{
var worksheet = classCodeDataDictPair.Key;
var classCodeData = classCodeDataDictPair.Value;
var dataName = $"{classCodeData.className}";
var path = $"{excelResolverConfig.SOPathRoot}/{classCodeData.className}/";
DirectoryUtil.MakeSureDirectory(path);
string[] assetGuids = AssetDatabase.FindAssets($"t:{dataName}", new[] { path });
Dictionary<string, ScriptableObject> originAssets = new();
for (int i = 0; i < assetGuids.Length; i++)
{
string assetPath = AssetDatabase.GUIDToAssetPath(assetGuids[i]);
ScriptableObject scriptableObject = AssetDatabase.LoadAssetAtPath<ScriptableObject>(assetPath);
originAssets.Add(scriptableObject.name, scriptableObject);
}
var result = new List<ScriptableObject>();
for (int row = 1; row <= worksheet.Dimension.End.Row; row++)
{
// 跳过注释行
if (worksheet.Cells[row, 1].Text.StartsWith("##")) continue;
var assetName = getAssetName(worksheet, row, classCodeData);
var fullPath = $"{path}{assetName}.asset";
if (originAssets.ContainsKey(assetName))
{
set(originAssets[assetName], worksheet, row, classCodeData);
EditorUtility.SetDirty(originAssets[assetName]);
Debug.Log($"刷新:{assetName}", originAssets[assetName]);
result.Add(originAssets[assetName]);
originAssets.Remove(assetName);
}
else
{
ScriptableObject instance = ScriptableObject.CreateInstance(dataName);
set(instance, worksheet, row, classCodeData);
AssetDatabase.CreateAsset(instance, fullPath);
Debug.Log($"创建:{assetName}", instance);
result.Add(instance);
}
}
foreach (var value in originAssets.Values)
{
Debug.LogError($"删除:{value.name}", value);
AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(value));
}
WriteUtilSO(path, result, classCodeData);
}
AssetDatabase.SaveAssets();
GC.Collect();
GC.WaitForPendingFinalizers();
void set(ScriptableObject instance, ExcelWorksheet worksheet, int row, ClassCodeData classCodeData)
{
foreach (var pair in classCodeData.fields)
{
var col = pair.Key;
var fieldData = pair.Value;
var cell = worksheet.Cells[row, col];
object convertedValue = ExcelResolverUtil.ConvertCellValue(cell, fieldData.type, classCodeData.className);
FieldInfo fieldInfo = instance.GetType().GetField(fieldData.varName);
if (fieldInfo == null) throw new Exception($"{classCodeData.className}中不存在字段:{fieldData.varName}");
fieldInfo.SetValue(instance, convertedValue);
}
}
string getAssetName(ExcelWorksheet worksheet, int row, ClassCodeData classCodeData)
{
switch (classCodeData.tableType)
{
case TableType.SingleKeyTable:
{
var keyColIndex = classCodeData.keyField[0].colIndex;
var key = worksheet.Cells[row, keyColIndex].Text;
if (!string.IsNullOrEmpty(key))
return $"{classCodeData.className}_{key}";
break;
}
case TableType.UnionMultiKeyTable:
{
var sb = new StringBuilder();
sb.Append(classCodeData.className);
foreach (var keyField in classCodeData.keyField)
{
var keyColIndex = keyField.colIndex;
var key = worksheet.Cells[row, keyColIndex].Text;
sb.Append("_");
sb.Append(key);
}
if (sb.Length > classCodeData.className.Length)
return sb.ToString();
break;
}
// case TableType.MultiKeyTable:
// return $"{classCodeData.className}_{classCodeData.keyField[0].varName}";
// case TableType.NotKetTable:
// return classCodeData.className;
// case TableType.ColumnTable:
// return $"{classCodeData.className}_{classCodeData.fields[2].Value.varName}";
}
throw new Exception($"无法定义资产名称 " +
$"className: '<color=cyan>{classCodeData.className}</color>' " +
$"FullAddress: <color=cyan>{row}</color> ");
}
}
}
}