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();