using System.Text.RegularExpressions; using JNPF.Common.Configuration; using JNPF.Common.Extension; using JNPF.Common.Models.NPOI; using JNPF.DataEncryption; using JNPF.DependencyInjection; namespace JNPF.Common.Security; /// /// 代码生成导出数据帮助类. /// [SuppressSniffer] public static class CodeGenExportDataHelper { /// /// 组装导出带子表的数据,返回 第一个合并行标头,第二个导出数据. /// /// 导出选择列. /// 原数据集合. /// 模板信息. /// 第一行标头 , 导出数据. public static object[] GetCreateFirstColumnsHeader(List selectKey, List> realList, List paramsModels) { //selectKey.ForEach(item => //{ // if (realList.Any(it => it.Keys.Contains(item))) // { // realList.FirstOrDefault()[item] = string.Empty; // } //}); selectKey.ForEach(item => { realList.ForEach(it => { if (!it.ContainsKey(item)) it.Add(item, string.Empty); }); }); var newRealList = realList.Copy(); realList.ForEach(items => { var rowChildDatas = new Dictionary>>(); foreach (var item in items) { if (item.Value != null && item.Key.ToLower().Contains("tablefield") && (item.Value is List> || item.Value.GetType().Name.Equals("JArray"))) { var ctList = item.Value.ToObject>>(); rowChildDatas.Add(item.Key, ctList); } } var len = rowChildDatas.Select(x => x.Value.Count()).OrderByDescending(x => x).FirstOrDefault(); if (len > 0) { for (int i = 0; i < len; i++) { if (i == 0) { var newRealItem = newRealList.Find(x => x["id"].Equals(items["id"])); foreach (var cData in rowChildDatas) { var itemData = cData.Value.FirstOrDefault(); if (itemData != null) { foreach (var key in itemData) if (newRealItem.ContainsKey(cData.Key + "-" + key.Key)) newRealItem[cData.Key + "-" + key.Key] = key.Value; } } } else { var newRealItem = new Dictionary(); foreach (var it in items) { if (it.Key.Equals("id")) newRealItem.Add(it.Key, it.Value); else newRealItem.Add(it.Key, string.Empty); } foreach (var cData in rowChildDatas) { if (cData.Value.Count > i) { foreach (var it in cData.Value[i]) if (newRealItem.ContainsKey(cData.Key + "-" + it.Key)) newRealItem[cData.Key + "-" + it.Key] = it.Value; } } newRealList.Add(newRealItem); } } } }); var resultList = new List>(); newRealList.ForEach(newRealItem => { if (!resultList.Any(x => x["id"].Equals(newRealItem["id"]))) resultList.AddRange(newRealList.Where(x => x["id"].Equals(newRealItem["id"])).ToList()); }); var firstColumns = new Dictionary(); if (selectKey.Any(x => x.Contains("-") && x.Contains("tableField"))) { var empty = string.Empty; var keyList = selectKey.Select(x => x.Split("-").First()).Distinct().ToList(); var mainFieldIndex = 1; keyList.ForEach(item => { if (item.Contains("tableField")) { var title = paramsModels.FirstOrDefault(x => x.field.Contains(item))?.value.Split("-")[0]; firstColumns.Add(title + empty, selectKey.Count(x => x.Contains(item))); empty += " "; mainFieldIndex = 1; } else { if (mainFieldIndex == 1) empty += " "; if (!firstColumns.ContainsKey(empty)) firstColumns.Add(empty, mainFieldIndex); else firstColumns[empty] = mainFieldIndex; mainFieldIndex++; } }); } return new object[] { firstColumns, resultList }; } /// /// 数据导出通用. /// /// 导出文件名. /// selectKey. /// 用户ID. /// 数据集合. /// 参数. /// 是否分组表格. /// 是否行内编辑. /// public static dynamic GetDataExport(string fileName, string selectKey, string userId, List> realList, List paramList, bool isGroupTable = false, bool isInlineEditor = false) { switch (isInlineEditor) { case true: paramList.ForEach(item => { item.field = string.Format("{0}_name", item.field); }); break; } // 如果是 分组表格 类型 if (isGroupTable) { List>? newValueList = new List>(); realList.ForEach(item => { List>? tt = item["children"].ToJsonString().ToObject>>(); newValueList.AddRange(tt); }); realList = newValueList; var selectKeyList = new List(); selectKey.Split(',').ToList().ForEach(item => { if (realList.Any(x => x.ContainsKey(item)) || item.ToLower().Contains("tablefield")) selectKeyList.Add(item); }); selectKey = string.Join(",", selectKeyList); } var res = GetCreateFirstColumnsHeader(selectKey.Split(',').ToList(), realList, paramList); var firstColumns = res.First().ToObject>(); var resultList = res.Last().ToObject>>(); List newSelectKey = selectKey.Split(',').ToList(); List newParamList = new List(); // 全部参数顺序 foreach (var item in firstColumns) { Regex re = new Regex(@"[\u4e00-\u9fa5]+"); switch (re.IsMatch(item.Key)) { case false: { var param = newSelectKey.GetRange(0, item.Value); newParamList.AddRange(paramList.FindAll(it => param.Contains(it.field))); newSelectKey.RemoveAll(it => newParamList.Select(it => it.field).ToList().Contains(it)); } break; default: var childTable = paramList.FindAll(it => it.value.Contains(item.Key.TrimEnd(' '))); childTable = childTable.FindAll(it => selectKey.Split(',').ToList().Contains(it.field)); newParamList.AddRange(childTable); newSelectKey.RemoveAll(it => newParamList.Select(it => it.field).ToList().Contains(it)); break; } } if (newParamList.Count > 0) newSelectKey = newParamList.Select(it => it.field).ToList(); try { List columnList = new List(); ExcelConfig excelconfig = new ExcelConfig(); excelconfig.FileName = string.Format("{0}.xls", fileName); excelconfig.HeadFont = "微软雅黑"; excelconfig.HeadPoint = 10; excelconfig.IsAllSizeColumn = true; excelconfig.ColumnModel = new List(); foreach (var item in newSelectKey) { ParamsModel isExist = new ParamsModel(); switch (isInlineEditor) { case true: isExist = paramList.Find(p => p.field.Equals(string.Format("{0}_name", item))); break; default: isExist = paramList.Find(p => p.field == item); break; } if (isExist != null) { excelconfig.ColumnModel.Add(new ExcelColumnModel() { Column = isExist.field, ExcelColumn = isExist.value }); columnList.Add(isExist.value); } } string? addPath = Path.Combine(FileVariable.TemporaryFilePath, excelconfig.FileName); var fs = (firstColumns == null || firstColumns.Count() < 1) ? ExcelExportHelper>.ExportMemoryStream(resultList, excelconfig, columnList) : ExcelExportHelper>.ExportMemoryStream(resultList, excelconfig, columnList, firstColumns); ExcelExportHelper>.Export(fs, addPath); var fName = userId + "|" + excelconfig.FileName + "|xls"; return new { name = excelconfig.FileName, url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fName, "JNPF") }; } catch (Exception) { throw; } } /// /// 模板导出. /// /// 导出文件名. /// selectKey. /// 用户ID. /// 数据集合. /// 参数. /// public static dynamic GetTemplateExport(string fileName, string selectKey, string userId, List> realList, List paramList = default) { var res = GetCreateFirstColumnsHeader(selectKey.Split(',').ToList(), realList, paramList); var firstColumns = res.First().ToObject>(); var resultList = res.Last().ToObject>>(); List newSelectKey = selectKey.Split(',').ToList(); try { List columnList = new List(); ExcelConfig excelconfig = new ExcelConfig(); excelconfig.FileName = string.Format("{0}.xls", fileName); excelconfig.HeadFont = "微软雅黑"; excelconfig.HeadPoint = 10; excelconfig.IsAllSizeColumn = true; excelconfig.ColumnModel = new List(); foreach (var item in newSelectKey) { ParamsModel isExist = new ParamsModel(); var import = realList.FirstOrDefault().Where(p => p.Key.Contains(string.Format("({0})", item))); if (import.Any()) { isExist = new ParamsModel() { field = item, value = import.FirstOrDefault().Key }; if (isExist != null) { excelconfig.ColumnModel.Add(new ExcelColumnModel() { Column = isExist.field, ExcelColumn = isExist.value }); columnList.Add(isExist.value); } } } string? addPath = Path.Combine(FileVariable.TemporaryFilePath, excelconfig.FileName); var fs = (firstColumns == null || firstColumns.Count() < 1) ? ExcelExportHelper>.ExportMemoryStream(realList, excelconfig, columnList) : ExcelExportHelper>.ExportMemoryStream(realList, excelconfig, columnList, firstColumns); ExcelExportHelper>.Export(fs, addPath); var fName = userId + "|" + excelconfig.FileName + "|xls"; return new { name = excelconfig.FileName, url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fName, "JNPF") }; } catch (Exception) { throw; } } }