excel導出時使用遞歸獲取層級關係

記錄java中層級排序導出excel

先看excel中的實現效果:
excel導出圖
系統中的效果圖
可以很清楚的看到,在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);
        }

    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章