diff --git a/Assets/Unity-Tools/ExcelResolver/Editor/Core/Util/ExcelResolverUtil.Cell.cs b/Assets/Unity-Tools/ExcelResolver/Editor/Core/Util/ExcelResolverUtil.Cell.cs
index 5c5fb20..ca3e932 100644
--- a/Assets/Unity-Tools/ExcelResolver/Editor/Core/Util/ExcelResolverUtil.Cell.cs
+++ b/Assets/Unity-Tools/ExcelResolver/Editor/Core/Util/ExcelResolverUtil.Cell.cs
@@ -8,6 +8,7 @@ namespace Tools.ExcelResolver.Editor
{
internal static partial class ExcelResolverUtil
{
+ /*
///
/// 读取指定行的数据
///
@@ -35,6 +36,19 @@ namespace Tools.ExcelResolver.Editor
values.Add(value);
}
return values;
+ }*/
+ internal static Dictionary ReadColumn(ExcelWorksheet worksheet, int col)
+ {
+ var endRow = worksheet.Dimension.End.Row;
+ var values = new Dictionary(endRow);
+ for (int row = 1; row <= endRow; row++)
+ {
+ // 跳过注释行
+ if (worksheet.Cells[row, 1].Text == "##" || string.IsNullOrEmpty(worksheet.Cells[row, col].Text)) continue;
+ string value = worksheet.Cells[row, col].Text.Trim();
+ values.Add(row, value);
+ }
+ return values;
}
///
@@ -71,6 +85,7 @@ namespace Tools.ExcelResolver.Editor
$"Text: '{cell.Text}' ");
}
+ /*
///
/// 通用的单元格 -> C# 对象转换
///
@@ -169,6 +184,6 @@ namespace Tools.ExcelResolver.Editor
? 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/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs
index 7635384..a770f1c 100644
--- a/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs
+++ b/Assets/Unity-Tools/ExcelResolver/Editor/ExcelResolverEditorWindow.ReadExcel.cs
@@ -109,6 +109,14 @@ namespace Tools.ExcelResolver.Editor
Assert.IsTrue(configs.Length >= 2, $"'{classCodeData.className}'配置错误,SingleKeyTable只能有一个主键");
var key = configs[1];
classCodeData.keyField = classCodeData.fields.Where(f => f.Value.varName == key).Select(p => p.Value).ToArray();
+ Assert.IsTrue(classCodeData.keyField.Length == 1, $"'{classCodeData.className}'配置错误,主键字段不存在或重复");
+ var keyDict = ExcelResolverUtil.ReadColumn(worksheet, classCodeData.keyField[0].colIndex);
+ var duplicateValues = keyDict.GroupBy(x => x.Value).Where(g => g.Count() > 1);
+ foreach (var duplicateValue in duplicateValues)
+ {
+ throw new Exception($"'{classCodeData.className}'主键字段存在重复值:'{duplicateValue.Key}' " +
+ $"行号:{string.Join(",", duplicateValue.Select(g => g.Key))}");
+ }
}
else if (config.Contains("UnionMultiKeyTable"))
{
diff --git a/Assets/_Project/ExcelResolver/Excel/hero.xlsx b/Assets/_Project/ExcelResolver/Excel/hero.xlsx
index 07deefe..14728ee 100644
Binary files a/Assets/_Project/ExcelResolver/Excel/hero.xlsx and b/Assets/_Project/ExcelResolver/Excel/hero.xlsx differ
diff --git a/Assets/_Project/ScriptableObject/Excel/Hero/Hero_5.asset b/Assets/_Project/ScriptableObject/Excel/Hero/Hero_5.asset
new file mode 100644
index 0000000..24af453
--- /dev/null
+++ b/Assets/_Project/ScriptableObject/Excel/Hero/Hero_5.asset
@@ -0,0 +1,80 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: e8aa3c1560079b84cafbabe4bc0d2c8d, type: 3}
+ m_Name: Hero_5
+ m_EditorClassIdentifier:
+ serializationData:
+ SerializedFormat: 2
+ SerializedBytes:
+ ReferencedUnityObjects: []
+ SerializedBytesString:
+ Prefab: {fileID: 0}
+ PrefabModificationsReferencedUnityObjects: []
+ PrefabModifications: []
+ SerializationNodes:
+ - Name: nihao
+ Entry: 7
+ Data: 0|System.Collections.Generic.Dictionary`2[[System.Int32, mscorlib],[System.Single,
+ mscorlib]], mscorlib
+ - Name: comparer
+ Entry: 7
+ Data: 1|System.Collections.Generic.GenericEqualityComparer`1[[System.Int32,
+ mscorlib]], mscorlib
+ - Name:
+ Entry: 8
+ Data:
+ - Name:
+ Entry: 12
+ Data: 0
+ - Name:
+ Entry: 13
+ Data:
+ - Name:
+ Entry: 8
+ Data:
+ - Name: attribute
+ Entry: 7
+ Data: 2|System.Collections.Generic.Dictionary`2[[Tools.ExcelResolver.Attribute,
+ Assembly-CSharp],[System.Int32, mscorlib]], mscorlib
+ - Name: comparer
+ Entry: 7
+ Data: 3|System.Collections.Generic.EnumEqualityComparer`1[[Tools.ExcelResolver.Attribute,
+ Assembly-CSharp]], mscorlib
+ - Name:
+ Entry: 12
+ Data: 0
+ - Name:
+ Entry: 13
+ Data:
+ - Name:
+ Entry: 8
+ Data:
+ - Name:
+ Entry: 12
+ Data: 0
+ - Name:
+ Entry: 13
+ Data:
+ - Name:
+ Entry: 8
+ Data:
+ id: 5
+ name:
+ icon:
+ has: 0
+ hp: 0
+ atk: 0
+ speed: 0
+ pos: {x: 0, y: 0, z: 0}
+ ches: {x: 0, y: 0}
+ attack_target: []
+ color: 0
diff --git a/Assets/_Project/ScriptableObject/Excel/Hero/Hero_5.asset.meta b/Assets/_Project/ScriptableObject/Excel/Hero/Hero_5.asset.meta
new file mode 100644
index 0000000..545c6ac
--- /dev/null
+++ b/Assets/_Project/ScriptableObject/Excel/Hero/Hero_5.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: c7b7eb46a7ca8244890947b043ee79ab
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant: