JAVA对树状结构数据导出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

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
实现树形结构代码导出 Excel合并相同父级的单元格,需要使用 Apache POI 库和递归算法来实现。下面是一个 Java 代码示例,用于将树形结构数据导出Excel 中,并将相同父级的单元格合并成一个单元格: ```java public void exportToExcel(List<Node> nodes, int level, int startRow, XSSFSheet sheet) { int rowNum = startRow; for (Node node : nodes) { XSSFRow row = sheet.createRow(rowNum++); // 设置单元格值 XSSFCell cell = row.createCell(level); cell.setCellValue(node.getName()); // 递归处理子节点 if (node.getChildren() != null && !node.getChildren().isEmpty()) { exportToExcel(node.getChildren(), level + 1, rowNum, sheet); // 合并相同父级单元格 int endRow = rowNum + node.getChildren().size() - 1; sheet.addMergedRegion(new CellRangeAddress(rowNum - 1, endRow, level, level)); rowNum = endRow + 1; } } } ``` 该方法接收一个 `List<Node>` 类型的树形结构数据,`level` 表示当前节点在树结构中的层级,`startRow` 表示当前节点在 Excel 表格中的起始行。`sheet` 表示要导出到的 Excel 工作表对象。 在方法的主体中,首先创建当前节点对应的行,设置单元格的值为节点的名称。然后递归处理子节点,递归时将当前层级 `level` 加 1,传递子节点的起始行 `rowNum`。递归完成后,如果当前节点存在子节点,则合并相同父级的单元格,并将 `rowNum` 设置为相应的结束行 `endRow + 1`,以便继续处理下一个节点。 注意,在合并单元格时,需要使用 `addMergedRegion` 方法,并传递一个 `CellRangeAddress` 对象作为参数。`CellRangeAddress` 对象的构造方法接收四个参数,分别表示起始行、结束行、起始列、结束列。在这里,我们将起始行设置为当前节点的起始行 `rowNum - 1`,结束行设置为当前节点的结束行 `endRow`,起始列和结束列都设置为当前节点的层级 `level`,这样就能够实现合并相同父级单元格的操作。 希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值