问题:读取Excel中的层级关系,返回一个树对象。
如图:
代码中没有用到递归,而是根据表格的层级关系特点,记录当前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;
}
}