記錄java中層級排序導出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);
}
}