【特性】excel title新增属性 non_empty,表示字段单元格值不能为空。 <name>&non_empty=1等效于 !<name>

【优化】excel中第一个字段默认为non_empty,避免了绝大多数情况下失误未填key时将空单元格当作key=默认值的问题
main
walon 2021-10-24 20:56:03 +08:00
parent 06467344a5
commit 029ac6ebd8
3 changed files with 39 additions and 6 deletions

View File

@ -29,6 +29,14 @@ namespace Luban.Job.Cfg.DataCreators
return o == null || (o is string s && s.Length == 0); 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) public DType Accept(TBool type, Sheet sheet, TitleRow row)
{ {
object x = row.Current; object x = row.Current;
@ -38,6 +46,7 @@ namespace Luban.Job.Cfg.DataCreators
} }
if (CheckDefault(x)) if (CheckDefault(x))
{ {
ThrowIfNonEmpty(row);
return DBool.ValueOf(false); return DBool.ValueOf(false);
} }
if (x is bool v) if (x is bool v)
@ -70,6 +79,7 @@ namespace Luban.Job.Cfg.DataCreators
} }
if (CheckDefault(x)) if (CheckDefault(x))
{ {
ThrowIfNonEmpty(row);
return DShort.Default; return DShort.Default;
} }
return DShort.ValueOf(short.Parse(x.ToString())); return DShort.ValueOf(short.Parse(x.ToString()));
@ -98,6 +108,7 @@ namespace Luban.Job.Cfg.DataCreators
} }
if (CheckDefault(x)) if (CheckDefault(x))
{ {
ThrowIfNonEmpty(row);
return DInt.Default; return DInt.Default;
} }
return DInt.ValueOf(int.Parse(x.ToString())); return DInt.ValueOf(int.Parse(x.ToString()));
@ -112,6 +123,7 @@ namespace Luban.Job.Cfg.DataCreators
} }
if (CheckDefault(x)) if (CheckDefault(x))
{ {
ThrowIfNonEmpty(row);
return DFint.Default; return DFint.Default;
} }
return DFint.ValueOf(int.Parse(x.ToString())); return DFint.ValueOf(int.Parse(x.ToString()));
@ -126,6 +138,7 @@ namespace Luban.Job.Cfg.DataCreators
} }
if (CheckDefault(x)) if (CheckDefault(x))
{ {
ThrowIfNonEmpty(row);
return DLong.Default; return DLong.Default;
} }
return DLong.ValueOf(long.Parse(x.ToString())); return DLong.ValueOf(long.Parse(x.ToString()));
@ -140,6 +153,7 @@ namespace Luban.Job.Cfg.DataCreators
} }
if (CheckDefault(x)) if (CheckDefault(x))
{ {
ThrowIfNonEmpty(row);
return DFlong.Default; return DFlong.Default;
} }
return DFlong.ValueOf(long.Parse(x.ToString())); return DFlong.ValueOf(long.Parse(x.ToString()));
@ -154,6 +168,7 @@ namespace Luban.Job.Cfg.DataCreators
} }
if (CheckDefault(x)) if (CheckDefault(x))
{ {
ThrowIfNonEmpty(row);
return DFloat.Default; return DFloat.Default;
} }
return DFloat.ValueOf(float.Parse(x.ToString())); return DFloat.ValueOf(float.Parse(x.ToString()));
@ -168,6 +183,7 @@ namespace Luban.Job.Cfg.DataCreators
} }
if (CheckDefault(x)) if (CheckDefault(x))
{ {
ThrowIfNonEmpty(row);
return DDouble.Default; return DDouble.Default;
} }
return DDouble.ValueOf(double.Parse(x.ToString())); 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) 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 (s == null)
{ {
if (type.IsNullable) if (type.IsNullable)
@ -270,7 +291,7 @@ namespace Luban.Job.Cfg.DataCreators
} }
catch (Exception e) catch (Exception e)
{ {
var dce = new DataCreateException(e, $"{fname}"); var dce = new DataCreateException(e, $"字段{fname}");
dce.Push(bean, f); dce.Push(bean, f);
throw dce; throw dce;
} }
@ -524,6 +545,7 @@ namespace Luban.Job.Cfg.DataCreators
} }
if (CheckDefault(d)) if (CheckDefault(d))
{ {
ThrowIfNonEmpty(row);
return DVector2.Default; return DVector2.Default;
} }
return DataUtil.CreateVector(type, d.ToString()); return DataUtil.CreateVector(type, d.ToString());
@ -538,6 +560,7 @@ namespace Luban.Job.Cfg.DataCreators
} }
if (CheckDefault(d)) if (CheckDefault(d))
{ {
ThrowIfNonEmpty(row);
return DVector3.Default; return DVector3.Default;
} }
return DataUtil.CreateVector(type, d.ToString()); return DataUtil.CreateVector(type, d.ToString());
@ -552,6 +575,7 @@ namespace Luban.Job.Cfg.DataCreators
} }
if (CheckDefault(d)) if (CheckDefault(d))
{ {
ThrowIfNonEmpty(row);
return DVector4.Default; return DVector4.Default;
} }
return DataUtil.CreateVector(type, d.ToString()); return DataUtil.CreateVector(type, d.ToString());

View File

@ -146,15 +146,16 @@ namespace Luban.Job.Cfg.DataSources.Excel
string titleName = attrs[0]; string titleName = attrs[0];
var tags = new Dictionary<string, string>(); var tags = new Dictionary<string, string>();
// * 开头的表示是多行 // * 开头的表示是多行
#if !LUBAN_LITE
if (titleName.StartsWith('*'))
#else
if (titleName.StartsWith("*")) if (titleName.StartsWith("*"))
#endif
{ {
titleName = titleName.Substring(1); titleName = titleName.Substring(1);
tags.Add("multi_rows", "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)) foreach (var attrPair in attrs.Skip(1))
{ {
var pairs = attrPair.Split('='); var pairs = attrPair.Split('=');

View File

@ -30,6 +30,8 @@ namespace Luban.Job.Cfg.DataSources.Excel
return string.IsNullOrEmpty(Sep) ? sep : Sep; return string.IsNullOrEmpty(Sep) ? sep : Sep;
} }
public bool NonEmpty { get; private set; }
public string Default { get; private set; } public string Default { get; private set; }
public bool SelfMultiRows { get; private set; } public bool SelfMultiRows { get; private set; }
@ -63,10 +65,16 @@ namespace Luban.Job.Cfg.DataSources.Excel
{ {
SortSubTitles(); SortSubTitles();
Sep = Tags.TryGetValue("sep", out var v) && !string.IsNullOrWhiteSpace(v) ? v : null; 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"); SelfMultiRows = Tags.TryGetValue("multi_rows", out var v2) && (v2 == "1" || v2 == "true");
Default = Tags.TryGetValue("default", out var v3) ? v3 : null; Default = Tags.TryGetValue("default", out var v3) ? v3 : null;
if (SubTitleList.Count > 0) if (SubTitleList.Count > 0)
{ {
if (Root)
{
// 第一个字段一般为key为了避免失误将空单元格当作key=0的数据默认非空
SubTitleList[0].Tags.TryAdd("non_empty", "1");
}
foreach (var sub in SubTitleList) foreach (var sub in SubTitleList)
{ {
sub.Init(); sub.Init();