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: