VisualUtils.java 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618
  1. package jnpf.base.util;
  2. import cn.afterturn.easypoi.excel.ExcelExportUtil;
  3. import cn.afterturn.easypoi.excel.entity.ExportParams;
  4. import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
  5. import cn.hutool.core.util.StrUtil;
  6. import jnpf.base.entity.VisualdevEntity;
  7. import jnpf.base.model.ColumnDataModel;
  8. import jnpf.base.model.ExportSelectedModel;
  9. import jnpf.base.model.Template6.ColumnListField;
  10. import jnpf.base.vo.DownloadVO;
  11. import jnpf.config.ConfigValueUtil;
  12. import jnpf.constant.FileTypeConstant;
  13. import jnpf.database.model.dbtable.JdbcTableModel;
  14. import jnpf.database.model.interfaces.DbSourceOrDbLink;
  15. import jnpf.entity.FileParameter;
  16. import jnpf.excel.ExcelExportStyler;
  17. import jnpf.excel.ExcelHelper;
  18. import jnpf.model.ExcelModel;
  19. import jnpf.model.visualJson.FieLdsModel;
  20. import jnpf.model.visualJson.FormDataModel;
  21. import jnpf.model.visualJson.config.HeaderModel;
  22. import jnpf.util.*;
  23. import jnpf.util.context.SpringContext;
  24. import jnpf.util.visiual.JnpfKeyConsts;
  25. import lombok.Cleanup;
  26. import lombok.extern.slf4j.Slf4j;
  27. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  28. import org.apache.poi.ss.usermodel.Sheet;
  29. import org.apache.poi.ss.usermodel.Workbook;
  30. import org.apache.poi.ss.util.CellRangeAddress;
  31. import org.dromara.x.file.storage.core.FileInfo;
  32. import org.springframework.web.multipart.MultipartFile;
  33. import java.sql.SQLException;
  34. import java.util.*;
  35. import java.util.stream.Collectors;
  36. /**
  37. * 可视化工具类
  38. *
  39. * @author JNPF开发平台组
  40. * @version V3.1.0
  41. * @copyright 引迈信息技术有限公司(https://www.jnpfsoft.com)
  42. * @date 2021年3月13日16:37:40
  43. */
  44. @Slf4j
  45. public class VisualUtils {
  46. private static ConfigValueUtil configValueUtil = SpringContext.getBean(ConfigValueUtil.class);
  47. private static FileInfo getFileInfo(MultipartFile multipartFile, String fileName) {
  48. FileInfo fileInfo = FileUploadUtils.uploadFile(new FileParameter(FileTypeConstant.TEMPORARY, fileName), multipartFile);
  49. return fileInfo;
  50. }
  51. /**
  52. * 去除多级嵌套控件
  53. *
  54. * @return
  55. */
  56. public static List<FieLdsModel> deleteMoreVmodel(FieLdsModel model) {
  57. if ("".equals(model.getVModel()) && model.getConfig().getChildren() != null) {
  58. List<FieLdsModel> childModelList = JsonUtil.getJsonToList(model.getConfig().getChildren(), FieLdsModel.class);
  59. return childModelList;
  60. }
  61. return null;
  62. }
  63. /**
  64. * 返回主键名称
  65. *
  66. * @param dbSourceOrDbLink
  67. * @param mainTable
  68. * @return
  69. */
  70. public static String getpKey(DbSourceOrDbLink dbSourceOrDbLink, String mainTable) throws SQLException {
  71. String pKeyName = "f_id";
  72. //catalog 数据库名
  73. String tmpKey = JdbcTableModel.getPrimaryExculde(dbSourceOrDbLink, mainTable, configValueUtil.getMultiTenantColumn());
  74. if (StrUtil.isNotEmpty(tmpKey)) {
  75. pKeyName = tmpKey;
  76. }
  77. return pKeyName;
  78. }
  79. /**
  80. * 导出在线开发的表格
  81. *
  82. * @param visualdevEntity
  83. * @param list
  84. * @param keys
  85. * @param sheetName
  86. * @param excelModel
  87. * @return
  88. */
  89. public static DownloadVO createModelExcel(VisualdevEntity visualdevEntity, List<Map<String, Object>> list, Collection<String> keys, String sheetName, String preName, ExcelModel excelModel) {
  90. //判断sheetName
  91. boolean SheetTitleWithField = !sheetName.equals("表单信息");
  92. DownloadVO vo = DownloadVO.builder().build();
  93. try {
  94. //去除空数据
  95. List<Map<String, Object>> dataList = new ArrayList<>();
  96. for (Map<String, Object> map : list) {
  97. int i = 0;
  98. for (String key : keys) {
  99. //子表
  100. if (key.toLowerCase().startsWith(JnpfKeyConsts.CHILD_TABLE_PREFIX)) {
  101. String tableField = key.substring(0, key.indexOf("-"));
  102. String field = key.substring(key.indexOf("-") + 1);
  103. Object o = map.get(tableField);
  104. if (o != null) {
  105. List<Map<String, Object>> childList = (List<Map<String, Object>>) o;
  106. for (Map<String, Object> childMap : childList) {
  107. if (childMap.get(field) != null) {
  108. i++;
  109. }
  110. }
  111. }
  112. } else {
  113. Object o = map.get(key);
  114. if (o != null) {
  115. i++;
  116. }
  117. }
  118. }
  119. if (map.get("errorsInfo") != null) {
  120. i++;
  121. }
  122. if (i > 0) {
  123. dataList.add(map);
  124. }
  125. }
  126. FormDataModel formDataModel = JsonUtil.getJsonToBean(visualdevEntity.getFormData(), FormDataModel.class);
  127. List<FieLdsModel> fieLdsModelList = JsonUtil.getJsonToList(formDataModel.getFields(), FieLdsModel.class);
  128. //递归
  129. List<FieLdsModel> allFields = new ArrayList<>();
  130. recursionFields(fieLdsModelList, allFields);
  131. Map<String, String> mainMap = new HashMap<>();
  132. allFields.stream().filter(a -> !a.getConfig().getJnpfKey().equals(JnpfKeyConsts.CHILD_TABLE)).forEach(m -> mainMap.put(m.getVModel(), m.getConfig().getLabel()));
  133. List<FieLdsModel> childFields = allFields.stream().filter(a -> a.getConfig().getJnpfKey().equals(JnpfKeyConsts.CHILD_TABLE)).collect(Collectors.toList());
  134. //创建导出属性对象
  135. List<ExportSelectedModel> allExportModelList = new ArrayList<>();
  136. for (String key : keys) {
  137. ExportSelectedModel exportSelectedModel = new ExportSelectedModel();
  138. if (key.toLowerCase().startsWith(JnpfKeyConsts.CHILD_TABLE_PREFIX)) {
  139. String tableField = key.substring(0, key.indexOf("-"));
  140. String field = key.substring(key.indexOf("-") + 1);
  141. FieLdsModel childTableModel = childFields.stream().filter(t -> tableField.equals(t.getVModel())).findFirst().orElse(null);
  142. FieLdsModel fieldKey = childTableModel.getConfig().getChildren().stream().filter(t -> field.equals(t.getVModel())).findFirst().orElse(null);
  143. String label = fieldKey.getConfig().getLabel();
  144. exportSelectedModel.setTableField(tableField);
  145. exportSelectedModel.setField(field);
  146. exportSelectedModel.setLabel(label);
  147. ExportSelectedModel childModel = allExportModelList.stream().filter(t -> tableField.equals(t.getTableField())).findFirst().orElse(null);
  148. List<ExportSelectedModel> childList;
  149. if (childModel != null) {
  150. childList = childModel.getSelectedModelList();
  151. childList.add(exportSelectedModel);
  152. } else {
  153. childList = new ArrayList<>();
  154. childList.add(exportSelectedModel);
  155. ExportSelectedModel newChild = new ExportSelectedModel();
  156. newChild.setTableField(childTableModel.getVModel());
  157. newChild.setSelectedModelList(childList);
  158. newChild.setLabel(childTableModel.getConfig().getLabel());
  159. allExportModelList.add(newChild);
  160. }
  161. } else {
  162. exportSelectedModel.setField(key);
  163. exportSelectedModel.setLabel(mainMap.get(key));
  164. allExportModelList.add(exportSelectedModel);
  165. }
  166. }
  167. List<ExcelExportEntity> entitys = new ArrayList<>();
  168. if (sheetName.equals("错误报告")) {
  169. entitys.add(new ExcelExportEntity("异常原因", "errorsInfo", 30));
  170. }
  171. for (ExportSelectedModel selectModel : allExportModelList) {
  172. ExcelExportEntity exportEntity;
  173. if (StringUtil.isNotEmpty(selectModel.getTableField())) {
  174. exportEntity = new ExcelExportEntity(selectModel.getLabel() + "(" + selectModel.getTableField() + ")", selectModel.getTableField());
  175. //+"("+selectModel.getTableField()+"-"+m.getField()+")"
  176. exportEntity.setList(selectModel.getSelectedModelList().stream().map(m -> new ExcelExportEntity(m.getLabel() + (SheetTitleWithField ? "(" + selectModel.getTableField() + "-" + m.getField() + ")" : "")
  177. , m.getField())).collect(Collectors.toList()));
  178. } else {
  179. // +"("+selectModel.getField()+")"
  180. exportEntity = new ExcelExportEntity(selectModel.getLabel() + (SheetTitleWithField ? "(" + selectModel.getField() + ")" : ""), selectModel.getField());
  181. }
  182. entitys.add(exportEntity);
  183. }
  184. //原数据和表头用于合并处理
  185. List<ExcelExportEntity> mergerEntitys = new ArrayList<>(entitys);
  186. List<Map<String, Object>> mergerList = new ArrayList<>(list);
  187. //复杂表头-表头和数据处理
  188. ColumnDataModel columnDataModel = JsonUtil.getJsonToBean(visualdevEntity.getColumnData(), ColumnDataModel.class);
  189. List<HeaderModel> complexHeaderList = columnDataModel.getComplexHeaderList();
  190. if (!Objects.equals(columnDataModel.getType(), 3) && !Objects.equals(columnDataModel.getType(), 5)) {
  191. //数据导出判断是否是行内
  192. boolean isLineEidtExport = SheetTitleWithField ? Objects.equals(columnDataModel.getType(), 4) : false;
  193. entitys = complexHeaderHandel(entitys, complexHeaderList, isLineEidtExport);
  194. dataList = complexHeaderDataHandel(dataList, complexHeaderList, isLineEidtExport);
  195. }
  196. ExportParams exportParams = new ExportParams(null, sheetName);
  197. exportParams.setStyle(ExcelExportStyler.class);
  198. if (sheetName.equals("错误报告")) {
  199. exportParams.setFreezeCol(1);
  200. }
  201. @Cleanup Workbook workbook = new HSSFWorkbook();
  202. if (entitys.size() > 0) {
  203. if (dataList.size() == 0) {
  204. dataList.add(new HashMap<>());
  205. }
  206. workbook = ExcelExportUtil.exportExcel(exportParams, entitys, dataList);
  207. mergerVertical(workbook, mergerEntitys, mergerList);
  208. ExcelHelper helper = new ExcelHelper();
  209. helper.init(workbook, exportParams, entitys, excelModel);
  210. helper.doPreHandle();
  211. helper.doPostHandle();
  212. }
  213. String fileName = preName + ".xls";
  214. if (sheetName.equals("错误报告")) {
  215. fileName = preName + "_" + DateUtil.dateNow("yyyyMMddHHmmss") + ".xls";
  216. }
  217. MultipartFile multipartFile = ExcelUtil.workbookToCommonsMultipartFile(workbook, fileName);
  218. FileInfo fileInfo = getFileInfo(multipartFile, fileName);
  219. vo.setName(fileInfo.getFilename());
  220. vo.setUrl(UploaderUtil.uploaderFile(fileInfo.getFilename() + "#" + "Temporary") + "&name=" + fileName);
  221. } catch (Exception e) {
  222. log.error("信息导出Excel错误:{}", e.getMessage());
  223. e.printStackTrace();
  224. }
  225. return vo;
  226. }
  227. public static void recursionFields(List<FieLdsModel> fieLdsModelList, List<FieLdsModel> allFields) {
  228. for (FieLdsModel fieLdsModel : fieLdsModelList) {
  229. if (JnpfKeyConsts.CHILD_TABLE.equals(fieLdsModel.getConfig().getJnpfKey())) {
  230. allFields.add(fieLdsModel);
  231. } else {
  232. if (fieLdsModel.getConfig().getChildren() != null) {
  233. recursionFields(fieLdsModel.getConfig().getChildren(), allFields);
  234. } else {
  235. List<String> needJnpfKey = Arrays.asList(JnpfKeyConsts.RELATIONFORM_ATTR, JnpfKeyConsts.POPUPSELECT_ATTR);
  236. if (StringUtil.isNotEmpty(fieLdsModel.getVModel()) || needJnpfKey.contains(fieLdsModel.getConfig().getJnpfKey())) {
  237. allFields.add(fieLdsModel);
  238. }
  239. }
  240. }
  241. }
  242. }
  243. /**
  244. * 视图导出
  245. *
  246. * @param columnData
  247. * @param list
  248. * @param keys
  249. * @param sheetName
  250. * @param excelModel
  251. * @return
  252. */
  253. public static DownloadVO createModelExcelApiData(String columnData, List<Map<String, Object>> list, Collection<String> keys, String sheetName, String preName, ExcelModel excelModel) {
  254. //判断sheetName
  255. DownloadVO vo = DownloadVO.builder().build();
  256. try {
  257. ColumnDataModel columnDataModel = JsonUtil.getJsonToBean(columnData, ColumnDataModel.class);
  258. List<ColumnListField> columnListAll = JsonUtil.getJsonToList(columnDataModel.getColumnList(), ColumnListField.class);
  259. List<ExcelExportEntity> entitys = new ArrayList<>();
  260. if (sheetName.equals("错误报告")) {
  261. entitys.add(new ExcelExportEntity("异常原因", "errorsInfo"));
  262. }
  263. for (ColumnListField selectModel : columnListAll) {
  264. if (keys.contains(selectModel.getProp())) {
  265. ExcelExportEntity exportEntity = new ExcelExportEntity(selectModel.getLabel());
  266. exportEntity.setKey(selectModel.getProp());
  267. exportEntity.setName(selectModel.getLabel());
  268. entitys.add(exportEntity);
  269. }
  270. }
  271. //原数据和表头用于合并处理
  272. List<ExcelExportEntity> mergerEntitys = new ArrayList<>(entitys);
  273. List<Map<String, Object>> mergerList = new ArrayList<>(list);
  274. //复杂表头-表头和数据处理
  275. List<HeaderModel> complexHeaderList = columnDataModel.getComplexHeaderList();
  276. if (!Objects.equals(columnDataModel.getType(), 3) && !Objects.equals(columnDataModel.getType(), 5)) {
  277. entitys = complexHeaderHandel(entitys, complexHeaderList, false);
  278. list = complexHeaderDataHandel(list, complexHeaderList, false);
  279. }
  280. ExportParams exportParams = new ExportParams(null, sheetName);
  281. exportParams.setStyle(ExcelExportStyler.class);
  282. if (sheetName.equals("错误报告")) {
  283. exportParams.setFreezeCol(1);
  284. }
  285. exportParams.setStyle(ExcelExportStyler.class);
  286. @Cleanup Workbook workbook = new HSSFWorkbook();
  287. if (entitys.size() > 0) {
  288. if (list.size() == 0) {
  289. list.add(new HashMap<>());
  290. }
  291. workbook = ExcelExportUtil.exportExcel(exportParams, entitys, list);
  292. mergerVertical(workbook, mergerEntitys, mergerList);
  293. ExcelHelper helper = new ExcelHelper();
  294. helper.init(workbook, exportParams, entitys, excelModel);
  295. helper.doPreHandle();
  296. helper.doPostHandle();
  297. }
  298. String fileName = preName + DateUtil.dateNow("yyyyMMddHHmmss") + ".xls";
  299. MultipartFile multipartFile = ExcelUtil.workbookToCommonsMultipartFile(workbook, fileName);
  300. FileInfo fileInfo = getFileInfo(multipartFile, fileName);
  301. vo.setName(fileInfo.getFilename());
  302. vo.setUrl(UploaderUtil.uploaderFile(fileInfo.getFilename() + "#" + "Temporary") + "&name=" + fileName);
  303. } catch (Exception e) {
  304. log.error("信息导出Excel错误:{}", e.getMessage());
  305. e.printStackTrace();
  306. }
  307. return vo;
  308. }
  309. public static String exampleExcelMessage(FieLdsModel model) {
  310. String value = "";
  311. String jnpfKey = model.getConfig().getJnpfKey();
  312. boolean multiple = model.getMultiple();
  313. if (JnpfKeyConsts.CHECKBOX.equals(jnpfKey)) {
  314. value = "选项一,选项二";
  315. } else if (JnpfKeyConsts.SELECT.equals(jnpfKey)) {
  316. value = multiple ? "选项一,选项二" : "";
  317. } else if (JnpfKeyConsts.CASCADER.equals(jnpfKey)) {
  318. value = multiple ? "选项1/选项1-1,选项2/选项2-1" : "选项1/选项1-1";
  319. } else if (JnpfKeyConsts.DATE.equals(jnpfKey) || JnpfKeyConsts.DATE_CALCULATE.equals(jnpfKey)) {
  320. value = model.getFormat();
  321. } else if (JnpfKeyConsts.TIME.equals(jnpfKey)) {
  322. value = model.getFormat();
  323. } else if (JnpfKeyConsts.COMSELECT.equals(jnpfKey)) {
  324. value = multiple ? "公司名称/部门名称,公司名称1/部门名称1" : "公司名称/部门名称";
  325. } else if (JnpfKeyConsts.DEPSELECT.equals(jnpfKey)) {
  326. value = multiple ? "部门名称/部门编码,部门名称1/部门编码1" : "部门名称/部门编码";
  327. } else if (JnpfKeyConsts.POSSELECT.equals(jnpfKey)) {
  328. value = multiple ? "组织名称/岗位名称,组织名称1/岗位名称1" : "组织名称/岗位名称";
  329. } else if (JnpfKeyConsts.USERSELECT.equals(jnpfKey)) {
  330. value = multiple ? "姓名/账号,姓名1/账号1" : "姓名/账号";
  331. } else if (JnpfKeyConsts.ROLESELECT.equals(jnpfKey)) {
  332. value = multiple ? "角色名称/角色编码,角色名称1/角色编码1" : "角色名称/角色编码";
  333. } else if (JnpfKeyConsts.GROUPSELECT.equals(jnpfKey)) {
  334. value = multiple ? "分组名称/分组编码,分组名称1/分组编码1" : "分组名称/分组编码";
  335. } else if (JnpfKeyConsts.CUSTOMUSERSELECT.equals(jnpfKey)) {
  336. value = multiple ? "姓名/账号,公司名称,部门名称/部门编码,岗位名称/岗位编码,角色名称/角色编码,分组名称/分组编码" : "姓名/账号";
  337. } else if (JnpfKeyConsts.TREESELECT.equals(jnpfKey)) {
  338. value = multiple ? "选项1,选项2" : "选项1";
  339. } else if (JnpfKeyConsts.ADDRESS.equals(jnpfKey)) {
  340. // 0 省 1 省市 2 省市区 3 省市区
  341. Integer level = model.getLevel();
  342. if (level == 0) {
  343. value = multiple ? "省,省1" : "省";
  344. }
  345. if (level == 1) {
  346. value = multiple ? "省/市,省1/市1" : "省/市";
  347. }
  348. if (level == 2) {
  349. value = multiple ? "省/市/区,省1/市1/区1" : "省/市/区";
  350. }
  351. if (level == 3) {
  352. value = multiple ? "省/市/区/街道,省1/市1/区1/街道1" : "省/市/区/街道";
  353. }
  354. } else {
  355. value = "";
  356. }
  357. return value;
  358. }
  359. /**
  360. * 复杂表头表头处理--代码生成
  361. *
  362. * @param dataList
  363. * @param complexHeaderList
  364. * @return
  365. */
  366. public static List<ExcelExportEntity> complexHeaderHandel(List<ExcelExportEntity> dataList, List<HeaderModel> complexHeaderList, boolean isLineEidtExport) {
  367. List<String> complexHeaderListStr = new ArrayList<>();
  368. complexHeaderList.forEach(item -> complexHeaderListStr.addAll(item.getChildColumns()));
  369. Map<String, Integer> complexMap1 = new HashMap<>();
  370. List<ExcelExportEntity> dataListRes = new ArrayList<>();
  371. int n = 0;//记录新数组下标用的,(dataListRes.add的地方就要n++)
  372. for (ExcelExportEntity entity : dataList) {
  373. String entityKey = isLineEidtExport ? entity.getKey().toString().split("_name")[0] : entity.getKey().toString();
  374. if (complexHeaderListStr.contains(entityKey)) {
  375. for (HeaderModel item : complexHeaderList) {
  376. if (item.getChildColumns() != null && item.getChildColumns().size() > 0 && item.getChildColumns().contains(entityKey)) {
  377. ExcelExportEntity export;
  378. if (complexMap1.get(item.getId()) == null) {
  379. complexMap1.put(item.getId(), n);
  380. export = new ExcelExportEntity(item.getFullName() + "(" + item.getId() + ")", item.getId());
  381. List<ExcelExportEntity> list = new ArrayList<>();
  382. export.setList(list);
  383. dataListRes.add(export);
  384. n++;
  385. } else {
  386. export = dataListRes.get(complexMap1.get(item.getId()));
  387. }
  388. List<ExcelExportEntity> list = export.getList() != null ? export.getList() : new ArrayList<>();
  389. list.add(entity);
  390. export.setList(list);
  391. dataListRes.set(complexMap1.get(item.getId()), export);
  392. continue;
  393. }
  394. }
  395. } else {
  396. dataListRes.add(entity);
  397. n++;
  398. }
  399. }
  400. return dataListRes;
  401. }
  402. /**
  403. * 复杂表头数据处理
  404. *
  405. * @param dataListRes
  406. * @param complexHeaderList
  407. * @return
  408. */
  409. public static List<Map<String, Object>> complexHeaderDataHandel(List<Map<String, Object>> dataListRes, List<HeaderModel> complexHeaderList, boolean isLineEidtExport) {
  410. List<String> complexHeaderListStr = new ArrayList<>();
  411. complexHeaderList.forEach(item -> complexHeaderListStr.addAll(item.getChildColumns()));
  412. List<String> complexMap1 = new ArrayList<>();
  413. List<Map<String, Object>> dataList = new ArrayList<>(dataListRes);
  414. for (Map<String, Object> map : dataList) {
  415. Set<String> keyset = new HashSet<>(map.keySet());
  416. for (String key : keyset) {
  417. String keyName = isLineEidtExport ? key.split("_name")[0] : key;
  418. if (complexHeaderListStr.contains(keyName)) {
  419. for (HeaderModel item : complexHeaderList) {
  420. if (item.getChildColumns().contains(keyName)) {
  421. if (complexMap1.contains(item.getId())) {
  422. List<Object> list1 = (List<Object>) map.get(item.getId());
  423. Map<String, Object> obj = list1 != null && list1.get(0) != null ? (Map<String, Object>) list1.get(0) : new HashMap<>();
  424. obj.put(key, map.get(key));
  425. map.put(item.getId(), new ArrayList() {{
  426. add(obj);
  427. }});
  428. } else {
  429. complexMap1.add(item.getId());
  430. Map<String, Object> obj = new HashMap<>();
  431. obj.put(key, map.get(key));
  432. map.put(item.getId(), new ArrayList() {{
  433. add(obj);
  434. }});
  435. }
  436. continue;
  437. }
  438. }
  439. }
  440. }
  441. }
  442. return dataList;
  443. }
  444. /**
  445. * 复杂表头表头处理--在线开发
  446. *
  447. * @param dataList
  448. * @param complexHeaderList
  449. * @return
  450. */
  451. public static List<Map<String, Object>> complexHeaderHandelOnline(List<Map<String, Object>> dataList, List<HeaderModel> complexHeaderList) {
  452. List<String> complexHeaderListStr = new ArrayList<>();
  453. complexHeaderList.forEach(item -> complexHeaderListStr.addAll(item.getChildColumns()));
  454. List<Object> uploadColumn = dataList.stream().map(t -> t.get("id")).collect(Collectors.toList());
  455. Map<String, Integer> complexMap1 = new HashMap<>();
  456. List<Map<String, Object>> dataListRes = new ArrayList<>();
  457. int n = 0;//记录新数组下标用的,(dataListRes.add的地方就要n++)
  458. for (HeaderModel item : complexHeaderList) {
  459. if (item.getChildColumns().size() > 0) {
  460. List<String> complexHasColumn = item.getChildColumns().stream().filter(t -> uploadColumn.contains(t)).collect(Collectors.toList());
  461. //判断复杂表头的字段是否有可导入字段--没有的话不生成复杂表头
  462. if (complexHasColumn.size() > 0) {
  463. complexMap1.put(item.getId(), n);
  464. Map<String, Object> map = new HashMap<>();
  465. map.put("id", item.getId());
  466. map.put("fullName", item.getFullName());
  467. map.put("jnpfKey", "complexHeader");
  468. dataListRes.add(map);
  469. n++;
  470. }
  471. }
  472. }
  473. for (Map<String, Object> entity : dataList) {
  474. if (complexHeaderListStr.contains(entity.get("id"))) {
  475. for (HeaderModel item : complexHeaderList) {
  476. if (item.getChildColumns().contains(entity.get("id"))) {
  477. Map<String, Object> map = dataListRes.get(complexMap1.get(item.getId()));
  478. List<Map<String, Object>> listmap = new ArrayList<>();
  479. if (map.get("children") == null) {
  480. listmap.add(entity);
  481. } else {
  482. listmap = (List<Map<String, Object>>) map.get("children");
  483. listmap.add(entity);
  484. }
  485. map.put("children", listmap);
  486. dataListRes.set(complexMap1.get(item.getId()), map);
  487. continue;
  488. }
  489. }
  490. } else {
  491. dataListRes.add(entity);
  492. }
  493. }
  494. return dataListRes;
  495. }
  496. /**
  497. * 复杂表头数据导入处理--在线开发
  498. *
  499. * @param dataList
  500. * @param entity
  501. * @return
  502. */
  503. public static List<Map<String, Object>> complexImportsDataOnline(List<Map<String, Object>> dataList, VisualdevEntity entity) {
  504. List<Map<String, Object>> listRes = new ArrayList<>();
  505. //复杂表头-表头和数据处理
  506. ColumnDataModel columnDataModel = JsonUtil.getJsonToBean(entity.getColumnData(), ColumnDataModel.class);
  507. List<HeaderModel> complexHeaderList = columnDataModel.getComplexHeaderList();
  508. if (!Objects.equals(columnDataModel.getType(), 3) && !Objects.equals(columnDataModel.getType(), 5)) {
  509. for (Map<String, Object> mapone : dataList) {
  510. for (HeaderModel item : complexHeaderList) {
  511. Object remove = mapone.remove(item.getId());
  512. if (remove != null) {
  513. List<Map<String, Object>> listC = (List<Map<String, Object>>) remove;
  514. if (listC.size() > 0) {
  515. mapone.putAll(listC.get(0));
  516. }
  517. }
  518. }
  519. listRes.add(mapone);
  520. }
  521. } else {
  522. listRes = dataList;
  523. }
  524. return listRes;
  525. }
  526. /**
  527. * 单元格垂直合并
  528. *
  529. * @param workbook
  530. * @param entityList
  531. * @param dataList
  532. */
  533. public static void mergerVertical(Workbook workbook, List<ExcelExportEntity> entityList, List<Map<String, Object>> dataList) {
  534. Sheet sheet = workbook.getSheetAt(0);
  535. //当前行
  536. int firstRow = 0;
  537. int lastRow = 0;
  538. for (Map<String, Object> obj : dataList) {
  539. //取出子表最大数量
  540. int size = 1;
  541. //判断有无子表
  542. List<ExcelExportEntity> hasChildList = entityList.stream().filter(t ->
  543. t.getKey().toString().toLowerCase().contains(JnpfKeyConsts.CHILD_TABLE_PREFIX)).collect(Collectors.toList());
  544. if (hasChildList.size() > 0) {
  545. for (ExcelExportEntity item : hasChildList) {
  546. String key = String.valueOf(item.getKey());
  547. if (obj.get(key) instanceof List) {
  548. List arr = (List) obj.get(key);
  549. if (arr.size() > size) {
  550. size = arr.size();
  551. }
  552. }
  553. }
  554. }
  555. //标题行数量
  556. int headSize = 1;
  557. List<ExcelExportEntity> collect = entityList.stream().filter(t -> t.getList() != null).collect(Collectors.toList());
  558. if (collect.size() >= 1) {
  559. headSize = 2;
  560. }
  561. if (size == 0) {
  562. firstRow = lastRow == 0 ? headSize : lastRow + 1;
  563. lastRow = firstRow;
  564. continue;
  565. } else {
  566. firstRow = lastRow == 0 ? headSize : lastRow + 1;
  567. lastRow = firstRow + size - 1;
  568. }
  569. int m = 0;
  570. for (int n = 0; n < entityList.size(); n++) {
  571. ExcelExportEntity export = entityList.get(n);
  572. if (export.getList() == null && firstRow != lastRow) {
  573. sheet.addMergedRegionUnsafe(new CellRangeAddress(firstRow, lastRow, m, m));
  574. }
  575. //计算子表字段个数
  576. if (export.getList() != null) {
  577. m = m + export.getList().size();
  578. } else {
  579. m++;
  580. }
  581. }
  582. }
  583. }
  584. }