excel导出时使用递归获取层级关系

记录java中层级排序导出excel

先看excel中的实现效果:
excel导出时使用递归获取层级关系_第1张图片
excel导出时使用递归获取层级关系_第2张图片
可以很清楚的看到,在excel中是按照系统中的层级依次排序的,下面说明关于这个的实现方法:主要思路就是通过递归来实现这个操作.
首先要明确我们需要获取什么,要拿到当前顺序排列的所有部件信息,并给它们按照层级来分级.
所以,通过需求,可以理出来大致步骤分为3步:
1.分层级
2.查找每一层级的对象
3.查找出来的对象进行排序
我们是可以获取到最顶层的部件对象的,通过它的API方法,我们可以查询到它拥有的link关系和它的子级对象(下一层级的).这样我们就可以写一个方法,获得当前部件的下一层级的所有子级部件集合,然后我们把这个集合按我们所需要的顺序进行排序,排序完成后,再次遍历这个集合,并再次调用我们定义的这个方法,这样就可以完成对应的需求了.
下面贴出代码:

 NmOid actionOid = commandBean.getActionOid();
            if (actionOid != null && (actionOid.getRefObject() instanceof WTPart)) {
                //顶层部件
                WTPart wtPart = (WTPart) actionOid.getRefObject();
                //所有子件的集合
                ArrayList<SonPartBean> beans1 = new ArrayList<>();
                //获得顶层部件的自定义bean对象
                SonPartBean topPart = new SonPartBean(intLevel.toString(), wtPart, null);
                //加入到最终集合里
                beans1.add(topPart);
                getChild(intLevel, wtPart, beans1);
                //拼接新名称
                fileName = "bom" + RESULT + XLSX;
                //输出到目标文件夹
                File resultFile = new File(TEMPPATH + File.separator + fileName);
                PIExcelWriter writer = new PIExcelWriter(EXCEL_TEMPLATE_PATH);
                writer.setStartRowIndex(1);
                writer.write2Workbook(beans1);
                writer.writeOutStream(resultFile);


	/**
     * 递归拿部件的子部件
     *
     * @param beans1
     * @throws WTException
     */
    private void getChild(Integer intLevel, WTPart part, ArrayList<SonPartBean> beans1) throws WTException {
        //查询对应的子级和link
        QueryResult childResult = PIPartHelper.service.findChildrenAndLinks(part);
        if (childResult == null || childResult.size() < 0) {
            return;
        }
        //层级
        intLevel = intLevel + 1;
        //childBeans主要是要重新排序
        List<SonPartBean> childBeans = new ArrayList<>();
        while (childResult.hasMoreElements()) {
            Persistable[] childAry = (Persistable[]) childResult.nextElement();
            //link对象
            WTPartUsageLink link = (WTPartUsageLink) childAry[0];
            //子级对象
            WTPart child1 = (WTPart) childAry[1];
            //获得这一层级的自定义bean对象
            SonPartBean bean = new SonPartBean(intLevel.toString(), child1, link);
            childBeans.add(bean);
        }
        //排序
        childBeans.sort(Comparator.comparing(SonPartBean::getPartNumber));
        //再次递归查询
        for (SonPartBean childBean : childBeans) {
            beans1.add(childBean);
            getChild(intLevel, childBean.getPart(), beans1);
        }

    }

你可能感兴趣的:(开发总结)