From eccf607522ba12e38f6ed1ad7120ecc4283314ba Mon Sep 17 00:00:00 2001 From: coffee <985942825@qq.com> Date: Mon, 27 Jan 2025 01:02:55 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A3=80=E6=9F=A5=E9=94=AE=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E6=9C=89=E9=87=8D=E5=A4=8D=E7=9A=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Core/Util/ExcelResolverUtil.Cell.cs | 17 +++- .../ExcelResolverEditorWindow.ReadExcel.cs | 8 ++ Assets/_Project/ExcelResolver/Excel/hero.xlsx | Bin 11078 -> 11123 bytes .../ScriptableObject/Excel/Hero/Hero_5.asset | 80 ++++++++++++++++++ .../Excel/Hero/Hero_5.asset.meta | 8 ++ 5 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 Assets/_Project/ScriptableObject/Excel/Hero/Hero_5.asset create mode 100644 Assets/_Project/ScriptableObject/Excel/Hero/Hero_5.asset.meta 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 07deefe224f51193ddbfbf57ceb70643117b3093..14728ee35eeac48eb026334fea8787b97e8d064c 100644 GIT binary patch delta 2206 zcmV;P2x0feR`XV{o&kRz)BN9G0RRAO0ssIJ0001FZ(~q$Z*X%jV{dY0E_iKheUjfw z!!Q`d?*-qX z=lkWHkHmv{RR%9$Y@t6qsej2#WT+VM}+io1&&MZIBtMp zy(gkAQi?sYo|>`+NP(e*3Y4>$b}0VwIxv;}bD&iYoK@i#wePfzd&rhzBktXETkMUq z*{n0`wlREuiXVSRH+OB-uu#pe1fVpQf(ZlMX_E?_WdJ%;+D>zBVtk-Adn~ziBfs*j z0C~Ac*KZ%|_s`YxYqflh@o(Lu+a?=6$iQb~nrOVdd5h^$i)G12T0r8$NvK({RXof1GNDT>lf0~jsySz z*$@B#7yy&dDixETDg}R)Sle==I1qi`s{IFw_W^?)$9CDCif{2XncD2-nP54l0*D3K z&dk?uOEMyA+t=2agf${VvyvcxKV@HlID^H# zMsdWxi{+LD5mtZkTrL;qk`+#vUaR=jAn)EKY)+W{C>nC56iZe?{xt~xU#>xL6Z|B=gPTUC zfr~Pv?=+-=Mqi_NCuJhvhh_XURau-@Rp_vd(+(~AZ7E_4N+D)1>gFAX7wvw%NvynzRP3pw^dfx!y} zjGo7>p?d~nh42T2iWS<{$a<$}6pA3*ndtudQ1Ei8svj;pO8|~3n&lQDM_V7`^Ck6=8erkXqVP|y+>cYH^Xd}@U z1_*x=ZE1iY(N+cs5^ZgOpmI0OkgWlNbln*sH*|$pSfj2=Rs~kFwkugRyL6jrJBn6; zD_UfQnE_H+LCehdVedXp_inTWu2AY^Q%sBKJILla+7eBSV|Kp*}xTl^XDciO5M$ zNPyNb?TKwI-{j07tWpCxU@oJP42$dN9d5Wrb;BvJ(Z03y(yY@Lb))u9AzBrS)6cX? zRP$U;z6w@U_d@3Cq2Wi34|Q;PjnOwMD>>>pDEnHYLW|mHlgKk$Z4!G1CgC{(+l_y! zDcCu(BEQP1-M9RZaW#!M@JrJ?@L@$+*-bhMCiz`m)uJ==2O#W;a;i77}P*W?a8 z3*N{s$ls#0uwrt6{4EE3pUbnDxMnmHqwq+4r3}uV<+mgJ1VF&eEeBq%2TED_1x|0A z_l2-iW@SM}@|Wlb{Nezeqj>~}eQ_7YAK4krSsp};-xrc>Az1j4QvE0~{tvTU2|fx0 zUot>mlb#dOf2E}5nv^_l;>`spU)MZ`6VDNzuHTczMEDNwY@u3&yCmp3rtlndreE5$ zPzoUlAfYJ6kP)9z$U?*wlt7~EkRY)G5l=8y%1D?JUXD&-NC@QbYzve&uz-On2@!)( zdZeV*6iSmminTUj|bWL>Gw&s=x}G2rLemY-vEb&dwvVH`n6pTJ8jG9x#Clq2N4yPPrqAAG zU%o*a;*@O{Awy~;oo-Z54l0xT`fL+M$|832b z|F!oQvj`Ty5CSG8lgTDO0f3VUCo=)0lRYPs1s>D<-(Qo}CsY9*lPV}c0eF*ZC@=xc zlbk3v0rQj7C@mXbGC*ER0ssK+1pojP000000000103ZMW0J)PJDM0~6lU*q~0cn$% zDK-I+lg}wY0X35lDm($1lT9ii9P1a-(~blH0ND@#02lxO000000096X0002R1e4Gz g6_cMTF9C^@&niU%c?*-!DixC}D-{OHCIA2c0C1-M=>Px# delta 2176 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 C$L7%h 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: