2017-05-25 45 views
0

我有一個類:如何使用Apache POI導出到Excel樹狀層級?

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

我怎樣才能導出的項目的樹使用Apache POI用於獲取文件像這樣練成(我只需要第一列在表中移):

A 
B 
    C 
D 
E 
    F 
    G 
+1

我可能是錯的,但該輸出看起來像樹的列表,而不是一個單一的樹。 (我這樣說是因爲它看起來像A,C,D和E處於同一水平,但看起來不像他們有共同的父母)。樹輸出是否有根? – Ishnark

+0

謝謝:)是的,父母是單身 –

+0

你可以使用'XSSFSheet'和'XSSFWorkbook'類來獲得幫助。看到我的回答 – Ishnark

回答

0

我的解決方案 - 合併。祝你今天愉快。謝謝。

是這樣的: https://docs.oracle.com/cd/E36352_01/epm.1112/disclosure_mgmt_admin/new_files/image002.jpg

我與融合的解決方案:

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; 
} 
+0

哦,我明白了。對不起,我不太明白你在找什麼,但我很高興它的工作!也歡迎Stack Overflow!一定要接受最適合你的答案,這樣其他人可以回答尚未解決的問題。 – Ishnark

1

一個簡單的解決方案是創建一個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類的一些假設。此解決方案可確保您創建一個新的行並且不會覆蓋現有的行(如果您的if環路在writeHelp中不存在)。

+0

但在這種情況下,我需要在同一列中的nodeName。而且我不知道如何根據節點級別修剪左邊的部分。 –

+0

當我看着我的excel文檔時,我看到了與你建議的相同的樹結構;它對你來說是什麼樣子/它應該是什麼樣子? – Ishnark

+0

https://docs.oracle.com/cd/E36352_01/epm.1112/disclosure_mgmt_admin/new_files/image002.jpg –