如何导出到使用Apache POI的树形结构?

我有一个class级:

class Node{ private Node parent; private List<Node> children; ... } 

如何使用Apache POI导出它的项目树来获取这样的文档(我只需要移动表中的第一列):

 A B C D E F G 

一个简单的解决scheme是创build一个NodeWriter类,它基本上将节点写入Excel电子表格:

 import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class NodeWriter { public void write(Node tree, String filePathName) { XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet = workbook.createSheet("Tree"); writeHelp(0, 1, tree, sheet); try (FileOutputStream outputStream = new FileOutputStream(filePathName)) { workbook.write(outputStream); workbook.close(); } catch (IOException e) { e.printStackTrace(); } } private void writeHelp(int indent, int rowNum, Node tree, XSSFSheet sheet) { if (sheet.getRow(rowNum) != null) { writeHelp(indent, rowNum+1, tree, sheet); } else { Row row = sheet.createRow(rowNum); Cell cell = row.createCell(indent); cell.setCellValue(tree.getNodeName()); for (Node child : tree.getChildren()) { writeHelp(indent + 1, rowNum + 1, child, sheet); } } } } 

我对你的Node类做了一些假设。 这个解决scheme可以确保你创build一个新的行,并且不会覆盖已经存在的行(因为if循环不在writeHelp )。

我的解决scheme – 合并。 祝你今天愉快。 谢谢。

看起来像这样: https : //docs.oracle.com/cd/E36352_01/epm.1112/disclosure_mgmt_admin/new_files/image002.jpg

我的解决scheme合并:

 private int createHierarchy(Sheet sheet, Node node, int currentRowIdx, int nodeLevel) { if(node.getParent() == null){ sheet.setColumnWidth(8, 1000); Row row = sheet.createRow(currentRowIdx); row.createCell(nodeLevel).setCellValue(node.getName()); row.createCell(9).setCellValue(node.getValue()); sheet.addMergedRegion(new CellRangeAddress(currentRowIdx, currentRowIdx, nodeLevel, 8)); nodeLevel++; } for (Node node : node.getChildren()) { Row row = sheet.createRow(++currentRowIdx); row.createCell(nodeLevel).setCellValue(node.getName()); row.createCell(9).setCellValue(node.getValue()); sheet.addMergedRegion(new CellRangeAddress(currentRowIdx, currentRowIdx, nodeLevel, 8)); currentRowIdx = createHierarchy(sheet, node, currentRowIdx, nodeLevel+1); } return currentRowIdx; }