针对树形结构数据进行Excel导出并进行合并处理
针对树形结构数据的Excel导出的
1 需求
针对树形结构的数据进行Excel导出并对数据进行合并单元格的操作
1 对象结构
import java.util.ArrayList;
import java.util.List;
/**
* @Created by LXY
* @Data: 2021/10/21 20:45
* 机电第三个 :技术措施
*/
@Data
public class ElectricTechnologyTest extends BaseEntity {
/**
* 名称
*/
private String name;
/**
* 父级的id
*/
private String parentId;
/**
* 序号
*/
private String serialNumber;
private String deptName;
private String roomTypeName;
/**
* 是否末级
* 0 不是
* 1 是
*/
private Integer isLast;
/**
* 层级
*/
private Integer level;
/**
* 排序
*/
private Integer orderNumber;
/**
* 更新人
*/
private String updateUserName;
/**
* 专业
*/
private String professionId;
private String professName;
/**
* 子孙节点
*/
private List<ElectricTechnologyTest> children = new ArrayList<ElectricTechnologyTest>();
}
2 对数据进行树形结构数据组合并且进行计算工具类
1 获取数据
List<ElectricTechnologyTest> collect = this.list().stream().map(v -> {
ElectricTechnologyTest vo = new ElectricTechnologyTest();
BeanUtil.copyProperties(v, vo);
return vo;
}).collect(Collectors.toList());
3 对数据库的数据进行处理(全文最重要的数据处理方法思路逻辑)
3.1 计算出末级的数据,没有子集或者是lsLast = 1的数据,进行计算,在这个计算中,需要对合并好的数据进行计算处理
private static List<String> ids = new ArrayList<>();
/**
* 递归对每个数据进行处理
*/
private static void getTheAfterTreatmentData(List<ElectricTechnologyTest> list){
if (list!=null) {
for (int i = 0; i < list.size(); i++) {
ElectricTechnologyTest vo = list.get(i);
List<ElectricTechnologyTest> children = vo.getChildren();
//拿到最末级的数据的ID,然后需要对这些数据进行反推处理
if (!DevUtil.list(children)){
ids.add(vo.getId());
}
electricTechnologyMapper.updateTheData(vo.getId(),vo.getSerialNumber());
getTheAfterTreatmentData(children);
}
}
}
4 递归查询 父节点信息
/**
* 递归查询父节点
* 利用递归来从子节点信息查找父节点信息
* 这里可以自己对数据进行处理,拿到自己想要的数据结构
*/
Map<String, ElectricTechnology> collect = service.list().stream().collect(Collectors.toMap(ElectricTechnology::getId, v -> v));
public static String getParentName(String id,Map<String, ElectricTechnology> map) {
ElectricTechnology entity = map.get(id);
if (entity != null) {
String configName = entity.getRemark() + "," + entity.getName() + ",";
String returnConfigName = getParentName(entity.getParentId(),map);
return returnConfigName + configName;
} else {
return "";
}
}
5 对数据写入Excel,
List<List<String>>
这样的数据需要进行二次遍历写入对应的Excel,然后对数据进行合并操作就可以达成自己想要的树形结构数据导出Excel自动合并同级相同内容的操作。
for (int i = 0; i < lists.size(); i++) {
SXSSFRow row0 = sheet.createRow(i);
for (int k = 0; k < lists.get(i).size(); k++) {
SXSSFCell cell = row0.createCell(k);
cell.setCellValue(lists.get(i).get(k));
cell.setCellStyle(style);
}
}
/**
* 合并操作
*/
for (int i = 0; i < lists.get(0).size(); i++) {
OfficeUtil.toMergeTheStand(sheet,style,0,i);
}
6 自动合并代码参考我的上一篇文章有详细的代码
效果
最后感谢各位观看 也可以多多交流QQ 954248544