【特性】cfg excel格式支持列表水平展时的多级标题头,可以为每个元素指定列。

main
walon 2021-11-30 18:50:08 +08:00
parent 57867bc14b
commit 7df2f6ea86
3 changed files with 53 additions and 54 deletions

View File

@ -399,27 +399,38 @@ namespace Luban.Job.Cfg.DataCreators
return datas; return datas;
} }
public DType Accept(TArray type, Sheet sheet, TitleRow row) private List<DType> ReadCollectionDatas(TType elementType, Sheet sheet, TitleRow row)
{ {
//string sep = DataUtil.GetSep(type);
if (row.Row != null) if (row.Row != null)
{ {
var s = row.AsStream(DataUtil.GetTypeSep(type.ElementType)); var s = row.AsStream(DataUtil.GetTypeSep(elementType));
return new DArray(type, ReadList(type.ElementType, s)); return ReadList(elementType, s);
} }
else if (row.Rows != null) else if (row.Rows != null)
{ {
var s = row.AsMultiRowStream(DataUtil.GetTypeSep(type.ElementType)); var s = row.AsMultiRowStream(DataUtil.GetTypeSep(elementType));
return new DArray(type, ReadList(type.ElementType, s)); return ReadList(elementType, s);
} }
else if (row.Fields != null) else if (row.Fields != null)
{ {
throw new Exception($"array 不支持 子字段. 忘记将字段设为多行模式? {row.SelfTitle.Name} => *{row.SelfTitle.Name}"); //throw new Exception($"array 不支持 子字段. 忘记将字段设为多行模式? {row.SelfTitle.Name} => *{row.SelfTitle.Name}");
var datas = new List<DType>(row.Fields.Count);
var sortedFields = row.Fields.Values.ToList();
sortedFields.Sort((a, b) => a.SelfTitle.FromIndex - b.SelfTitle.FromIndex);
foreach (var field in sortedFields)
{
if (field.IsBlank)
{
continue;
}
datas.Add(elementType.Apply(this, sheet, field));
}
return datas;
} }
else if (row.Elements != null) else if (row.Elements != null)
{ {
return new DArray(type, row.Elements.Select(e => type.ElementType.Apply(this, sheet, e)).ToList()); return row.Elements.Select(e => elementType.Apply(this, sheet, e)).ToList();
} }
else else
{ {
@ -427,56 +438,20 @@ namespace Luban.Job.Cfg.DataCreators
} }
} }
public DType Accept(TArray type, Sheet sheet, TitleRow row)
{
//string sep = DataUtil.GetSep(type);
return new DArray(type, ReadCollectionDatas(type.ElementType, sheet, row));
}
public DType Accept(TList type, Sheet sheet, TitleRow row) public DType Accept(TList type, Sheet sheet, TitleRow row)
{ {
if (row.Row != null) return new DList(type, ReadCollectionDatas(type.ElementType, sheet, row));
{
var s = row.AsStream(DataUtil.GetTypeSep(type.ElementType));
return new DList(type, ReadList(type.ElementType, s));
}
else if (row.Rows != null)
{
var s = row.AsMultiRowStream(DataUtil.GetTypeSep(type.ElementType));
return new DList(type, ReadList(type.ElementType, s));
}
else if (row.Fields != null)
{
throw new Exception($"list 不支持 子字段. 忘记将字段设为多行模式? {row.SelfTitle.Name} => *{row.SelfTitle.Name}");
}
else if (row.Elements != null)
{
return new DList(type, row.Elements.Select(e => type.ElementType.Apply(this, sheet, e)).ToList());
}
else
{
throw new Exception();
}
} }
public DType Accept(TSet type, Sheet sheet, TitleRow row) public DType Accept(TSet type, Sheet sheet, TitleRow row)
{ {
if (row.Row != null) return new DSet(type, ReadCollectionDatas(type.ElementType, sheet, row));
{
var s = row.AsStream(DataUtil.GetTypeSep(type.ElementType));
return new DSet(type, ReadList(type.ElementType, s));
}
else if (row.Rows != null)
{
var s = row.AsMultiRowStream(DataUtil.GetTypeSep(type.ElementType));
return new DSet(type, ReadList(type.ElementType, s));
}
else if (row.Fields != null)
{
throw new Exception($"set 不支持 子字段");
}
else if (row.Elements != null)
{
throw new NotSupportedException();
}
else
{
throw new Exception();
}
} }
public DType Accept(TMap type, Sheet sheet, TitleRow row) public DType Accept(TMap type, Sheet sheet, TitleRow row)

View File

@ -45,7 +45,7 @@ namespace Luban.Job.Cfg.DataSources.Excel
{ {
if (!SubTitles.TryAdd(title.Name, title)) if (!SubTitles.TryAdd(title.Name, title))
{ {
throw new Exception($"标题:{title.Name} 重复"); throw new Exception($":{title.Name} 重复");
} }
SubTitleList.Add(title); SubTitleList.Add(title);
} }

View File

@ -62,6 +62,30 @@ namespace Luban.Job.Cfg.DataSources.Excel
} }
} }
public bool IsBlank
{
get
{
if (Row != null)
{
return Sheet.IsBlankRow(Row, SelfTitle.FromIndex, SelfTitle.ToIndex);
}
if (Rows != null)
{
return Sheet.IsBlankRow(Rows[0], SelfTitle.FromIndex, SelfTitle.ToIndex);
}
if (Fields != null)
{
return Fields.Values.All(f => f.IsBlank);
}
if (Elements != null)
{
return Elements.All(e => e.IsBlank);
}
throw new Exception();
}
}
public ExcelStream AsStream(string sep) public ExcelStream AsStream(string sep)
{ {
if (string.IsNullOrEmpty(SelfTitle.Sep)) if (string.IsNullOrEmpty(SelfTitle.Sep))