From 029ac6ebd8b2899634310f4958101f364997987e Mon Sep 17 00:00:00 2001 From: walon Date: Sun, 24 Oct 2021 20:56:03 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E7=89=B9=E6=80=A7=E3=80=91excel=20tit?= =?UTF-8?q?le=E6=96=B0=E5=A2=9E=E5=B1=9E=E6=80=A7=20non=5Fempty,=E8=A1=A8?= =?UTF-8?q?=E7=A4=BA=E5=AD=97=E6=AE=B5=E5=8D=95=E5=85=83=E6=A0=BC=E5=80=BC?= =?UTF-8?q?=E4=B8=8D=E8=83=BD=E4=B8=BA=E7=A9=BA=E3=80=82=20&non=5Fem?= =?UTF-8?q?pty=3D1=E7=AD=89=E6=95=88=E4=BA=8E=20!=20=E3=80=90?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E3=80=91excel=E4=B8=AD=E7=AC=AC=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E5=AD=97=E6=AE=B5=E9=BB=98=E8=AE=A4=E4=B8=BAnon=5Femp?= =?UTF-8?q?ty=EF=BC=8C=E9=81=BF=E5=85=8D=E4=BA=86=E7=BB=9D=E5=A4=A7?= =?UTF-8?q?=E5=A4=9A=E6=95=B0=E6=83=85=E5=86=B5=E4=B8=8B=E5=A4=B1=E8=AF=AF?= =?UTF-8?q?=E6=9C=AA=E5=A1=ABkey=E6=97=B6=E5=B0=86=E7=A9=BA=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=A0=BC=E5=BD=93=E4=BD=9Ckey=3D=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E5=80=BC=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Source/DataCreators/SheetDataCreator.cs | 28 +++++++++++++++++-- .../Source/DataSources/Excel/SheetLoadUtil.cs | 9 +++--- .../Source/DataSources/Excel/Title.cs | 8 ++++++ 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/Luban.Job.Cfg/Source/DataCreators/SheetDataCreator.cs b/src/Luban.Job.Cfg/Source/DataCreators/SheetDataCreator.cs index 9c8ed88..2759956 100644 --- a/src/Luban.Job.Cfg/Source/DataCreators/SheetDataCreator.cs +++ b/src/Luban.Job.Cfg/Source/DataCreators/SheetDataCreator.cs @@ -29,6 +29,14 @@ namespace Luban.Job.Cfg.DataCreators return o == null || (o is string s && s.Length == 0); } + private void ThrowIfNonEmpty(TitleRow row) + { + if (row.SelfTitle.NonEmpty) + { + throw new Exception($"字段不允许为空"); + } + } + public DType Accept(TBool type, Sheet sheet, TitleRow row) { object x = row.Current; @@ -38,6 +46,7 @@ namespace Luban.Job.Cfg.DataCreators } if (CheckDefault(x)) { + ThrowIfNonEmpty(row); return DBool.ValueOf(false); } if (x is bool v) @@ -70,6 +79,7 @@ namespace Luban.Job.Cfg.DataCreators } if (CheckDefault(x)) { + ThrowIfNonEmpty(row); return DShort.Default; } return DShort.ValueOf(short.Parse(x.ToString())); @@ -98,6 +108,7 @@ namespace Luban.Job.Cfg.DataCreators } if (CheckDefault(x)) { + ThrowIfNonEmpty(row); return DInt.Default; } return DInt.ValueOf(int.Parse(x.ToString())); @@ -112,6 +123,7 @@ namespace Luban.Job.Cfg.DataCreators } if (CheckDefault(x)) { + ThrowIfNonEmpty(row); return DFint.Default; } return DFint.ValueOf(int.Parse(x.ToString())); @@ -126,6 +138,7 @@ namespace Luban.Job.Cfg.DataCreators } if (CheckDefault(x)) { + ThrowIfNonEmpty(row); return DLong.Default; } return DLong.ValueOf(long.Parse(x.ToString())); @@ -140,6 +153,7 @@ namespace Luban.Job.Cfg.DataCreators } if (CheckDefault(x)) { + ThrowIfNonEmpty(row); return DFlong.Default; } return DFlong.ValueOf(long.Parse(x.ToString())); @@ -154,6 +168,7 @@ namespace Luban.Job.Cfg.DataCreators } if (CheckDefault(x)) { + ThrowIfNonEmpty(row); return DFloat.Default; } return DFloat.ValueOf(float.Parse(x.ToString())); @@ -168,6 +183,7 @@ namespace Luban.Job.Cfg.DataCreators } if (CheckDefault(x)) { + ThrowIfNonEmpty(row); return DDouble.Default; } return DDouble.ValueOf(double.Parse(x.ToString())); @@ -202,7 +218,12 @@ namespace Luban.Job.Cfg.DataCreators public DType Accept(TString type, Sheet sheet, TitleRow row) { - var s = ParseString(row.Current); + object x = row.Current; + if (CheckDefault(x)) + { + ThrowIfNonEmpty(row); + } + var s = ParseString(x); if (s == null) { if (type.IsNullable) @@ -270,7 +291,7 @@ namespace Luban.Job.Cfg.DataCreators } catch (Exception e) { - var dce = new DataCreateException(e, $"列:{fname}"); + var dce = new DataCreateException(e, $"字段:{fname}"); dce.Push(bean, f); throw dce; } @@ -524,6 +545,7 @@ namespace Luban.Job.Cfg.DataCreators } if (CheckDefault(d)) { + ThrowIfNonEmpty(row); return DVector2.Default; } return DataUtil.CreateVector(type, d.ToString()); @@ -538,6 +560,7 @@ namespace Luban.Job.Cfg.DataCreators } if (CheckDefault(d)) { + ThrowIfNonEmpty(row); return DVector3.Default; } return DataUtil.CreateVector(type, d.ToString()); @@ -552,6 +575,7 @@ namespace Luban.Job.Cfg.DataCreators } if (CheckDefault(d)) { + ThrowIfNonEmpty(row); return DVector4.Default; } return DataUtil.CreateVector(type, d.ToString()); diff --git a/src/Luban.Job.Cfg/Source/DataSources/Excel/SheetLoadUtil.cs b/src/Luban.Job.Cfg/Source/DataSources/Excel/SheetLoadUtil.cs index 7f648f8..942f328 100644 --- a/src/Luban.Job.Cfg/Source/DataSources/Excel/SheetLoadUtil.cs +++ b/src/Luban.Job.Cfg/Source/DataSources/Excel/SheetLoadUtil.cs @@ -146,15 +146,16 @@ namespace Luban.Job.Cfg.DataSources.Excel string titleName = attrs[0]; var tags = new Dictionary(); // * 开头的表示是多行 -#if !LUBAN_LITE - if (titleName.StartsWith('*')) -#else if (titleName.StartsWith("*")) -#endif { titleName = titleName.Substring(1); tags.Add("multi_rows", "1"); } + if (titleName.StartsWith("!")) + { + titleName = titleName.Substring(1); + tags.Add("non_empty", "1"); + } foreach (var attrPair in attrs.Skip(1)) { var pairs = attrPair.Split('='); diff --git a/src/Luban.Job.Cfg/Source/DataSources/Excel/Title.cs b/src/Luban.Job.Cfg/Source/DataSources/Excel/Title.cs index a220a4e..7336da2 100644 --- a/src/Luban.Job.Cfg/Source/DataSources/Excel/Title.cs +++ b/src/Luban.Job.Cfg/Source/DataSources/Excel/Title.cs @@ -30,6 +30,8 @@ namespace Luban.Job.Cfg.DataSources.Excel return string.IsNullOrEmpty(Sep) ? sep : Sep; } + public bool NonEmpty { get; private set; } + public string Default { get; private set; } public bool SelfMultiRows { get; private set; } @@ -63,10 +65,16 @@ namespace Luban.Job.Cfg.DataSources.Excel { SortSubTitles(); Sep = Tags.TryGetValue("sep", out var v) && !string.IsNullOrWhiteSpace(v) ? v : null; + NonEmpty = Tags.TryGetValue("non_empty", out var ne) && ne == "1"; SelfMultiRows = Tags.TryGetValue("multi_rows", out var v2) && (v2 == "1" || v2 == "true"); Default = Tags.TryGetValue("default", out var v3) ? v3 : null; if (SubTitleList.Count > 0) { + if (Root) + { + // 第一个字段一般为key,为了避免失误将空单元格当作key=0的数据,默认非空 + SubTitleList[0].Tags.TryAdd("non_empty", "1"); + } foreach (var sub in SubTitleList) { sub.Init();