package com.fanruan.api.report.analy; import com.fanruan.api.report.analy.data.TreeNode; import com.fr.cache.list.IntList; import com.fr.form.ui.Widget; import com.fr.main.workbook.ResultWorkBook; import com.fr.report.cell.ResultCellElement; import com.fr.report.cell.WidgetAttrElem; import com.fr.report.report.Report; import com.fr.report.report.ResultReport; import com.fr.report.web.button.form.TreeNodeToggleButton; import com.fr.report.worksheet.AnalysisRWorkSheet; import com.fr.script.Calculator; import com.fr.web.core.TreeHTMLWriter; import com.fr.web.core.reportcase.WebElementReportCase; import com.fr.web.output.html.chwriter.ViewCellWriter; import com.fr.web.request.EmptyRepository; import java.util.HashMap; import java.util.Iterator; import java.util.Map; /** * @author zack * @since 2019/8/23 * @version 10.0 * 数据分析相关工具类 */ public class AnalyKit { /** * 折叠树模板,将结果报表行转成一个树形数据结构 * * @param book 结果报表 * @param index sheet索引 * @return 树节点集合 */ public static Map generateResultBookTree(ResultWorkBook book, int index) { ResultReport resultWS = book.getResultReport(index); if (!(resultWS instanceof AnalysisRWorkSheet)) { //只有分析预览支持折叠树 throw new UnsupportedOperationException(); } AnalysisRWorkSheet analysisRWorkSheet = (AnalysisRWorkSheet) resultWS; Calculator c = Calculator.createCalculator(); c.setAttribute(Report.KEY, analysisRWorkSheet); TreeHTMLWriter htmlWriter = new TreeHTMLWriter(); ViewCellWriter cellHtmlWriter = new ViewCellWriter(new EmptyRepository(), 1, resultWS.getReportSettings(), true); htmlWriter.writeReportToHtml(new WebElementReportCase(analysisRWorkSheet, new EmptyRepository()), 1, cellHtmlWriter, new EmptyRepository(), ""); cellHtmlWriter.dealWithAllTreeNodeRelation(c); return generateNodeTree(analysisRWorkSheet); } private static Map generateNodeTree(AnalysisRWorkSheet resultWS) { int rowSize = resultWS.getRowCount(); Map nodeMap = new HashMap(); for (int rowIndex = 0; rowIndex < rowSize; rowIndex++) {//遍历行 ResultCellElement treeNodeCell = findToggleCell(resultWS, rowIndex); if (treeNodeCell != null) { Widget widget = ((WidgetAttrElem) treeNodeCell).getWidget(); IntList sonList = ((TreeNodeToggleButton) widget).getRelativeIndexList(); if (sonList != null && sonList.size() > 1) { if (sonList.get(0) == -1) { //折叠行 if (nodeMap.containsKey(treeNodeCell.getRow())) { continue; } buildNodeMap(resultWS, treeNodeCell, nodeMap, -1); } else { //折叠列 暂不处理 } } } } return nodeMap; } private static ResultCellElement findToggleCell(AnalysisRWorkSheet reportCase, int rowIndex) { Iterator cellIterator = reportCase.getRow(rowIndex); while (cellIterator.hasNext()) { ResultCellElement tmpCell = (ResultCellElement) cellIterator.next(); if (tmpCell instanceof WidgetAttrElem) { if (((WidgetAttrElem) tmpCell).getWidget() instanceof TreeNodeToggleButton) { return tmpCell; } } } return null; } private static void buildNodeMap(AnalysisRWorkSheet reportCase, ResultCellElement cellElment, Map nodeMap, int parent) { if (cellElment == null) { return; } TreeNodeToggleButton toggleButton = (TreeNodeToggleButton) ((WidgetAttrElem) cellElment).getWidget(); int self = cellElment.getRow(); IntList sonList = toggleButton.getRelativeIndexList(); if (sonList != null && sonList.size() > 1) { if (sonList.get(0) == -1) {//折叠行 nodeMap.put(self, new TreeNode(self, parent, sonList)); int size = sonList.size(); for (int i = 0; i < size; i++) { buildNodeMap(reportCase, findToggleCell(reportCase, sonList.get(i)), nodeMap, self); } } } } }