记录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);
}
}