我有一個類:如何使用Apache POI導出到Excel樹狀層級?
class Node{
private Node parent;
private List<Node> children;
...
}
我怎樣才能導出的項目的樹使用Apache POI用於獲取文件像這樣練成(我只需要第一列在表中移):
A
B
C
D
E
F
G
我有一個類:如何使用Apache POI導出到Excel樹狀層級?
class Node{
private Node parent;
private List<Node> children;
...
}
我怎樣才能導出的項目的樹使用Apache POI用於獲取文件像這樣練成(我只需要第一列在表中移):
A
B
C
D
E
F
G
我的解決方案 - 合併。祝你今天愉快。謝謝。
是這樣的: 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;
}
哦,我明白了。對不起,我不太明白你在找什麼,但我很高興它的工作!也歡迎Stack Overflow!一定要接受最適合你的答案,這樣其他人可以回答尚未解決的問題。 – Ishnark
一個簡單的解決方案是創建一個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
中不存在)。
但在這種情況下,我需要在同一列中的nodeName。而且我不知道如何根據節點級別修剪左邊的部分。 –
當我看着我的excel文檔時,我看到了與你建議的相同的樹結構;它對你來說是什麼樣子/它應該是什麼樣子? – Ishnark
https://docs.oracle.com/cd/E36352_01/epm.1112/disclosure_mgmt_admin/new_files/image002.jpg –
我可能是錯的,但該輸出看起來像樹的列表,而不是一個單一的樹。 (我這樣說是因爲它看起來像A,C,D和E處於同一水平,但看起來不像他們有共同的父母)。樹輸出是否有根? – Ishnark
謝謝:)是的,父母是單身 –
你可以使用'XSSFSheet'和'XSSFWorkbook'類來獲得幫助。看到我的回答 – Ishnark