diff --git a/src/Luban.Job.Cfg/Source/DataCreators/ExcelStreamDataCreator.cs b/src/Luban.Job.Cfg/Source/DataCreators/ExcelStreamDataCreator.cs index da0ccdd..ab37295 100644 --- a/src/Luban.Job.Cfg/Source/DataCreators/ExcelStreamDataCreator.cs +++ b/src/Luban.Job.Cfg/Source/DataCreators/ExcelStreamDataCreator.cs @@ -3,6 +3,7 @@ using Luban.Common.Utils; using Luban.Job.Cfg.Datas; using Luban.Job.Cfg.DataSources.Excel; using Luban.Job.Cfg.Defs; +using Luban.Job.Cfg.TypeVisitors; using Luban.Job.Cfg.Utils; using Luban.Job.Common.Types; using Luban.Job.Common.TypeVisitors; @@ -263,6 +264,8 @@ namespace Luban.Job.Cfg.DataCreators public DType Accept(TText type, ExcelStream x) { //x = SepIfNeed(type, x); + x = TrySep(type, x); + string key = ParseString(x.Read()); if (key == null) { @@ -372,12 +375,15 @@ namespace Luban.Job.Cfg.DataCreators public DType Accept(TBean type, ExcelStream x) { - var originX = x; var originBean = (DefBean)type.Bean; if (!string.IsNullOrEmpty(originBean.Sep)) { x = new ExcelStream(x.ReadCell(), originBean.Sep); } + else + { + x = TrySep(type, x); + } if (originBean.IsAbstractType) { @@ -416,50 +422,59 @@ namespace Luban.Job.Cfg.DataCreators } } + private static ExcelStream TrySep(TType type, ExcelStream stream) + { + string sep = type.GetTag("sep"); + if (string.IsNullOrEmpty(sep) && type.ElementType != null && type.ElementType.Apply(IsNotSepTypeVisitor.Ins)) + { + sep = DataUtil.SimpleContainerSep; + } + + if (!string.IsNullOrEmpty(sep) && !stream.TryReadEOF()) + { + stream = new ExcelStream(stream.ReadCell(), sep); + } + return stream; + } + // 容器类统统不支持 type.IsNullable // 因为貌似没意义? - public List ReadList(TType type, ExcelStream stream) + public List ReadList(TType type, TType eleType, ExcelStream stream) { var datas = new List(); - string elementSep = type.GetTag("sep"); + stream = TrySep(type, stream); while (!stream.TryReadEOF()) { - if (string.IsNullOrEmpty(elementSep)) - { - datas.Add(type.Apply(this, stream)); - } - else - { - datas.Add(type.Apply(this, new ExcelStream(stream.ReadCell(), elementSep))); - } + datas.Add(eleType.Apply(this, stream)); } return datas; } public DType Accept(TArray type, ExcelStream x) { - return new DArray(type, ReadList(type.ElementType, x)); + return new DArray(type, ReadList(type, type.ElementType, x)); } public DType Accept(TList type, ExcelStream x) { - return new DList(type, ReadList(type.ElementType, x)); + return new DList(type, ReadList(type, type.ElementType, x)); } public DType Accept(TSet type, ExcelStream x) { - return new DSet(type, ReadList(type.ElementType, x)); + return new DSet(type, ReadList(type, type.ElementType, x)); } - public DType Accept(TMap type, ExcelStream x) + public DType Accept(TMap type, ExcelStream stream) { //x = SepIfNeed(type, x); + stream = TrySep(type, stream); var datas = new Dictionary(); - while (!x.TryReadEOF()) + while (!stream.TryReadEOF()) { - var key = type.KeyType.Apply(this, x); - var value = type.ValueType.Apply(this, x); + var key = type.KeyType.Apply(this, stream); + var value = type.ValueType.Apply(this, stream); if (!datas.TryAdd(key, value)) { throw new InvalidExcelDataException($"map 的 key:{key} 重复"); diff --git a/src/Luban.Job.Cfg/Source/DataCreators/SheetDataCreator.cs b/src/Luban.Job.Cfg/Source/DataCreators/SheetDataCreator.cs index 91fb51f..06994b4 100644 --- a/src/Luban.Job.Cfg/Source/DataCreators/SheetDataCreator.cs +++ b/src/Luban.Job.Cfg/Source/DataCreators/SheetDataCreator.cs @@ -249,7 +249,10 @@ namespace Luban.Job.Cfg.DataCreators public DType Accept(TText type, Sheet sheet, TitleRow row) { - if (!type.HasTag("sep")) + //var s = row.AsStream(row.SelfTitle.Sep); + //return type.Apply(ExcelStreamDataCreator.Ins, s); + + if (string.IsNullOrEmpty(row.SelfTitle.SepOr(type.GetTag("sep")))) { if (row.CellCount != 2) { @@ -267,7 +270,7 @@ namespace Luban.Job.Cfg.DataCreators } else { - var s = row.AsStream(type.GetTag("sep")); + var s = row.AsStream(row.SelfTitle.Sep); return type.Apply(ExcelStreamDataCreator.Ins, s); } } @@ -364,12 +367,7 @@ namespace Luban.Job.Cfg.DataCreators public DType Accept(TBean type, Sheet sheet, TitleRow row) { - string sep = "";// type.GetBeanAs().Sep; - if (string.IsNullOrWhiteSpace(sep)) - { - sep = row.SelfTitle.SepOr(type.GetTag("sep")); - } - + string sep = row.SelfTitle.Sep;// type.GetBeanAs().Sep; if (row.Row != null) { @@ -482,16 +480,16 @@ namespace Luban.Job.Cfg.DataCreators return datas; } - private List ReadCollectionDatas(TType elementType, Sheet sheet, TitleRow row, string containerSep) + private List ReadCollectionDatas(TType type, TType elementType, Sheet sheet, TitleRow row) { if (row.Row != null) { - var s = row.AsStream(string.IsNullOrEmpty(containerSep) ? DataUtil.GetCollectionElementTypeSep(elementType) : containerSep); - return ExcelStreamDataCreator.Ins.ReadList(elementType, s); + var s = row.AsStream(row.SelfTitle.Sep); + return ExcelStreamDataCreator.Ins.ReadList(type, elementType, s); } else if (row.Rows != null) { - var s = row.AsMultiRowStream(string.IsNullOrEmpty(containerSep) ? DataUtil.GetCollectionElementTypeSep(elementType) : containerSep); + var s = row.AsMultiRowStream(row.SelfTitle.Sep); return ReadList(elementType, s); } else if (row.Fields != null) @@ -524,36 +522,27 @@ 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, row.SelfTitle.SepOr(type.GetTag("sep")))); + return new DArray(type, ReadCollectionDatas(type, type.ElementType, sheet, row)); } public DType Accept(TList type, Sheet sheet, TitleRow row) { - return new DList(type, ReadCollectionDatas(type.ElementType, sheet, row, row.SelfTitle.SepOr(type.GetTag("sep")))); + return new DList(type, ReadCollectionDatas(type, type.ElementType, sheet, row)); } public DType Accept(TSet type, Sheet sheet, TitleRow row) { - return new DSet(type, ReadCollectionDatas(type.ElementType, sheet, row, row.SelfTitle.SepOr(type.GetTag("sep")))); + return new DSet(type, ReadCollectionDatas(type, type.ElementType, sheet, row)); } public DType Accept(TMap type, Sheet sheet, TitleRow row) { - string sep = row.SelfTitle.SepOr(type.GetTag("sep")); + string sep = row.SelfTitle.Sep; if (row.Row != null) { var s = row.AsStream(sep); - var datas = new Dictionary(); - - while (!s.TryReadEOF()) - { - var key = type.KeyType.Apply(ExcelStreamDataCreator.Ins, s); - var value = type.ValueType.Apply(ExcelStreamDataCreator.Ins, s); - datas.Add(key, value); - } - - return new DMap(type, datas); + return type.Apply(ExcelStreamDataCreator.Ins, s); } else if (row.Rows != null) {