using Luban.Job.Cfg.Datas; using Luban.Job.Cfg.DataSources.Excel; using Luban.Job.Cfg.DataVisitors; using Luban.Job.Cfg.Defs; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Luban.Job.Cfg.DataConverts { public class FillSheetVisitor : IDataFuncVisitor { private readonly List _cells; private readonly int _columnSize; private int _startRowIndex; public FillSheetVisitor(List cells, int columnSize, int startRowIndex) { _cells = cells; _columnSize = columnSize; _startRowIndex = startRowIndex; } void SetTitleValue(Title title, object value) { while (_cells.Count <= _startRowIndex) { var row = new object[_columnSize]; _cells.Add(row); } _cells[_startRowIndex][title.FromIndex] = value; } public int Accept(DBool type, Title x) { SetTitleValue(x, type.Value); return 1; } public int Accept(DByte type, Title x) { SetTitleValue(x, type.Value); return 1; } public int Accept(DShort type, Title x) { SetTitleValue(x, type.Value); return 1; } public int Accept(DFshort type, Title x) { SetTitleValue(x, type.Value); return 1; } public int Accept(DInt type, Title x) { SetTitleValue(x, type.Value); return 1; } public int Accept(DFint type, Title x) { SetTitleValue(x, type.Value); return 1; } public int Accept(DLong type, Title x) { SetTitleValue(x, type.Value); return 1; } public int Accept(DFlong type, Title x) { SetTitleValue(x, type.Value); return 1; } public int Accept(DFloat type, Title x) { SetTitleValue(x, type.Value); return 1; } public int Accept(DDouble type, Title x) { SetTitleValue(x, type.Value); return 1; } public int Accept(DEnum type, Title x) { SetTitleValue(x, type.StrValue); return 1; } public int Accept(DString type, Title x) { SetTitleValue(x, type.Value); return 1; } public int Accept(DBytes type, Title x) { throw new NotImplementedException(); } public int Accept(DText type, Title x) { //if (x.FromIndex == x.ToIndex) //{ // throw new Exception($"title:{x.Name}为text类型,至少要占两列"); //} SetTitleValue(x, type.Apply(ToExcelStringVisitor.Ins, x.Sep)); //(_cells[_startRowIndex, x.FromIndex + 1] as Range).Value = type.RawValue; return 1; } public int Accept(DBean type, Title x) { if (x.SubTitleList.Count > 0) { if (type.Type.IsAbstractType) { if (!x.SubTitles.TryGetValue(DefBean.TYPE_NAME_KEY, out var typeTitle)) { throw new Exception($"多态bean:{type.Type.FullName} 缺失 __type__ 标题列"); } if (type.ImplType != null) { SetTitleValue(typeTitle, type.ImplType.Name); } else { SetTitleValue(typeTitle, DefBean.BEAN_NULL_STR); } } else { if (type.ImplType != null) { } else { //Current(x).Value = "null"; throw new Exception($"title:{x.Name} 不支持 值为null的普通bean"); } } int rowCount = 1; if (type.ImplType != null) { int index = 0; foreach (var field in type.ImplType.HierarchyFields) { var data = type.Fields[index++]; if (!x.SubTitles.TryGetValue(field.Name, out var fieldTitle)) { throw new Exception($"title:{x.Name} 子title:{field.Name} 缺失"); } if (data != null) { //if (fieldTitle.SubTitleList.Count > 0) //{ rowCount = Math.Max(rowCount, data.Apply(this, fieldTitle)); //} //else //{ // (_cells[_startRowIndex, fieldTitle.FromIndex] as Range).Value = data.Apply(ToExcelStringVisitor.Ins, fieldTitle.Sep); //} } } } return rowCount; } else { SetTitleValue(x, type.Apply(ToExcelStringVisitor.Ins, x.Sep)); return 1; } } public int Accept(DArray type, Title x) { if (x.SelfMultiRows) { int oldStartRow = _startRowIndex; int totalRow = 0; try { foreach (var ele in type.Datas) { totalRow += ele.Apply(this, x); _startRowIndex = oldStartRow + totalRow; } return totalRow; } finally { _startRowIndex = oldStartRow; } } else { SetTitleValue(x, type.Apply(ToExcelStringVisitor.Ins, x.Sep)); return 1; } } public int Accept(DList type, Title x) { if (x.SelfMultiRows) { int oldStartRow = _startRowIndex; int totalRow = 0; try { foreach (var ele in type.Datas) { totalRow += ele.Apply(this, x); _startRowIndex = oldStartRow + totalRow; } return totalRow; } finally { _startRowIndex = oldStartRow; } } else { SetTitleValue(x, type.Apply(ToExcelStringVisitor.Ins, x.Sep)); return 1; } } public int Accept(DSet type, Title x) { SetTitleValue(x, type.Apply(ToExcelStringVisitor.Ins, x.Sep)); return 1; } public int Accept(DMap type, Title x) { SetTitleValue(x, type.Apply(ToExcelStringVisitor.Ins, x.Sep)); return 1; } public int Accept(DVector2 type, Title x) { var v = type.Value; SetTitleValue(x, $"{v.X}, {v.Y}"); return 1; } public int Accept(DVector3 type, Title x) { var v = type.Value; SetTitleValue(x, $"{v.X}, {v.Y}, {v.Z}"); return 1; } public int Accept(DVector4 type, Title x) { var v = type.Value; SetTitleValue(x, $"{v.X}, {v.Y}, {v.Z}, {v.W}"); return 1; } public int Accept(DDateTime type, Title x) { SetTitleValue(x, type.Time); return 1; } } }