private static void exportNodeToExcel(Node node, Sheet sheet, int rowIndex, int level) { // 创建一行并填充节点数据 Row row = sheet.createRow(rowIndex); row.createCell(0).setCellValue(node.getId()); row.createCell(1).setCellValue(node.getName()); // 如果当前节点有子节点,则递归导出子节点 if (node.getChildren() != null && !node.getChildren().isEmpty()) { // 对子节点按照 parentId 进行分组 Map<Integer, List<Node>> childrenGrouped = node.getChildren().stream() .collect(Collectors.groupingBy(Node::getParentId)); // 对每个 parentId 分组进行递归导出,并记录每个分组的起始行和结束行 List<CellRangeAddress> mergedRegions = new ArrayList<>(); for (List<Node> children : childrenGrouped.values()) { int startRow = rowIndex + 1; for (Node child : children) { exportNodeToExcel(child, sheet, rowIndex + 1, level + 1); rowIndex++; } int endRow = rowIndex; // 如果该分组的 parentId 与当前节点的 parentId 相同,则说明该分组的父节点与当前节点相同,可以进行跨行合并 if (children.get(0).getParentId() == node.getId()) { mergedRegions.add(new CellRangeAddress(startRow, endRow, 0, 0)); } } // 对每个分组进行跨行合并 for (CellRangeAddress mergedRegion : mergedRegions) { sheet.addMergedRegion(mergedRegion); } } }优化这段代码导出excel只导出name
时间: 2024-02-14 12:05:48 浏览: 71
如果您只需要导出每个节点的 `name` 字段,则可以修改 `exportNodeToExcel` 方法,只填充节点名称到 Excel 表格中。修改后的代码如下:
```java
private static void exportNodeToExcel(Node node, Sheet sheet, int rowIndex, int level) {
// 创建一行并填充节点名称
Row row = sheet.createRow(rowIndex);
row.createCell(0).setCellValue(node.getName());
// 如果当前节点有子节点,则递归导出子节点
if (node.getChildren() != null && !node.getChildren().isEmpty()) {
// 对子节点按照 parentId 进行分组
Map<Integer, List<Node>> childrenGrouped = node.getChildren().stream()
.collect(Collectors.groupingBy(Node::getParentId));
// 对每个 parentId 分组进行递归导出,并记录每个分组的起始行和结束行
List<CellRangeAddress> mergedRegions = new ArrayList<>();
for (List<Node> children : childrenGrouped.values()) {
int startRow = rowIndex + 1;
for (Node child : children) {
exportNodeToExcel(child, sheet, rowIndex + 1, level + 1);
rowIndex++;
}
int endRow = rowIndex;
// 如果该分组的 parentId 与当前节点的 parentId 相同,则说明该分组的父节点与当前节点相同,可以进行跨行合并
if (children.get(0).getParentId() == node.getId()) {
mergedRegions.add(new CellRangeAddress(startRow, endRow, 0, 0));
}
}
// 对每个分组进行跨行合并
for (CellRangeAddress mergedRegion : mergedRegions) {
sheet.addMergedRegion(mergedRegion);
}
}
}
```
在修改的代码中,我们仅在创建行时填充了 `node` 的 `name` 字段,而不是 `id` 和 `name` 字段。这将只创建拥有节点名称的单元格。
其他部分的代码保持不变,因为我们仍然需要递归导出子节点,并在需要时合并父节点单元格。
阅读全文