#nullable enable using Furion.DatabaseAccessor; using System.ComponentModel; using System.Reflection; namespace iWare.Wms.Core.Util { public static class DataConvertUtil { public static void ToExcelData(List source, IRepository sysDictTypeRep, IRepository sysDictDataRep, out List headers, out List> data, out string sheetName) { headers = new List(); data = new List>(); var type = typeof(T); sheetName = ((DescriptionAttribute?)type.GetCustomAttribute(typeof(DescriptionAttribute), true))?.Description ?? "无"; List enumClassNames = new(); foreach (var field in type.GetProperties(BindingFlags.Public | BindingFlags.Instance)) { if ("Id".Equals(field.Name)) continue; headers.Add(((DescriptionAttribute?)field.GetCustomAttribute(typeof(DescriptionAttribute), true))?.Description ?? "无"); var dataType = StringUtil.ParseTrueType2(field.PropertyType.FullName ?? ""); if (TypeUtil.GetType(dataType)?.IsEnum ?? false) { if (!enumClassNames.Contains(dataType)) { enumClassNames.Add(dataType); } } } var dictTypeList = sysDictTypeRep.DetachedEntities.Where(x => enumClassNames.Contains(x.EnumClassName)).ToList(); List dictTypeIds = dictTypeList.Select(x => x.Id).ToList(); Dictionary dictTypeDictionary = new(); dictTypeList.ForEach(x => dictTypeDictionary.Add(x.Id, x)); var dictDataList = sysDictDataRep.DetachedEntities.Where(x => dictTypeIds.Contains(x.TypeId)).ToList(); dictDataList.ForEach(x => { if (dictTypeDictionary.ContainsKey(x.TypeId)) { var dictType = dictTypeDictionary[x.TypeId]; if (dictType?.SysDictDatas == null) { if (dictType != null) { dictType.SysDictDatas = new List(); } } dictType?.SysDictDatas?.Add(x); } }); Dictionary map = new(); dictTypeList.ForEach(x => { if (x?.SysDictDatas != null) { foreach (SysDictData dictData in x.SysDictDatas) { if (dictData != null) map.Add(x.EnumClassName + "#" + dictData.Code, dictData.Value); } } }); foreach (var t in source) { List objectList = new(); foreach (var field in type.GetProperties(BindingFlags.Public | BindingFlags.Instance)) { var fieldName = field.Name; if ("Id".Equals(fieldName)) continue; var v = t?.GetType()?.GetProperty(fieldName)?.GetValue(t); var dataType = StringUtil.ParseTrueType2(field.PropertyType.FullName ?? ""); if (TypeUtil.GetType(dataType)?.IsEnum ?? false) { v = Convert.ToInt32(v); if (map.ContainsKey(dataType + "#" + v)) v = map[dataType + "#" + v]; } else if ("System.DateTimeOffset".Equals(dataType)) { v = (((DateTimeOffset?)v)?.ToString("yyyy/MM/dd HH:mm:ss")) ?? ""; } else if ("System.DateTime".Equals(dataType)) { v = (((DateTime?)v)?.ToString("yyyy/MM/dd HH:mm:ss")) ?? ""; } objectList.Add(v ?? ""); } data.Add(objectList); } } } }