问题:读取Excel中的层级关系,返回一个树对象。

如图:

【练习题】Java读取Excel层级内容,并返回一个树形(tree)对象。

代码中没有用到递归,而是根据表格的层级关系特点,记录当前row的父层,废话不说,直接上代码:

//先定义一个tree型实体

package TreeDemo;

import java.util.List;

public class TreeNode {
    private String name;// 名称
    private String id;// id
    private String pid;//父ID
    private List<TreeNode>  child;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public List<TreeNode> getChild() {
        return child;
    }
    public void setChild(List<TreeNode> child) {
        this.child = child;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getPid() {
        return pid;
    }
    public void setPid(String pid) {
        this.pid = pid;
    }
}

下面是遍历读取表格

package TreeDemo;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;

/**
 * 读取表格中的层级关系
 * 
 * @author:weihx
 * @date 2019年4月12日
 */
public class XlsxUtil {

    public static void main(String[] args) {
        long t1=System.currentTimeMillis();
        TreeNode treeNode = treeeee();
        long t2=System.currentTimeMillis();
        System.out.println(t2-t1);
    }

    private static TreeNode treeeee() {
        // 先初始化一个结果
        TreeNode treeNode = new TreeNode();
        File excelFile = new File("F:\\Workspace\\demo.xlsx"); // 替换你文档地址
        XSSFWorkbook wb = null;
        try {
            wb = new XSSFWorkbook(new FileInputStream(excelFile));
        } catch (IOException e) {
            e.printStackTrace();
        }
        int numberOfSheets = wb.getNumberOfSheets();
        for (int x = 0; x < numberOfSheets; x++) {
            XSSFSheet sheet = wb.getSheetAt(x);
            int columnNum = 0;
            if (sheet.getRow(0) != null) {
                columnNum = sheet.getRow(0).getLastCellNum() - sheet.getRow(0).getFirstCellNum();
            }
            // 初始化一些计数器
            int id = 0; // 遍历赋值连续ID
            int level = 0;// 记录层级
            int rowNumber = 0;// 记录行号
            treeNode.setId("" + id);
            treeNode.setName("关系图");
            treeNode.setChild(new ArrayList<TreeNode>());
            // 初始化一个缓存map , 用于缓存最新的父类
            HashMap<Integer, TreeNode> map = new HashMap<Integer, TreeNode>();
            map.put(level, treeNode);
            // 开始遍历
            if (columnNum > 0) {
                for (Row row : sheet) {
                    rowNumber++;
                    // 跳过前两行
                    if (rowNumber < 3) {
                        continue;
                    }

                    String[] singleRow = new String[columnNum];
                    int n = 0;
                    for (int i = 0; i < columnNum; i++) {
                        // 查询到有信息的行
                        Cell cell = row.getCell(i, Row.CREATE_NULL_AS_BLANK);
                        // 判断是否为空
                        if (cell.getCellType() == Cell.CELL_TYPE_BLANK) {
                            n++;
                            // 跳过循环
                            continue;
                        } else {// 不是空
                            id++;
                            singleRow[n] = cell.getStringCellValue().trim();
                            TreeNode treeNodeTmp = new TreeNode();
                            level = n + 1;
                            treeNodeTmp.setId("" + id);
                            treeNodeTmp.setName(singleRow[n]);
                            treeNodeTmp.setChild(new ArrayList<TreeNode>());
                            // 取到他的父类
                            TreeNode pTreeNode = map.get(n);
                            treeNodeTmp.setPid(pTreeNode.getId());
                            pTreeNode.getChild().add(treeNodeTmp);
                            // 更新缓存
                            map.put(level, treeNodeTmp);
                            break;
                        }
                    }
                }
            }
        }
        return treeNode;
    }
}

 

 

相关文章:

  • 2021-10-05
  • 2021-04-07
  • 2022-02-09
  • 2022-01-17
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-10-30
  • 2021-03-31
  • 2022-02-04
  • 2022-12-23
  • 2021-12-19
  • 2022-12-23
相关资源
相似解决方案