poi根据树型结构数据嵌套画Excel表格
是帮别人做了东西,然后顺便发到这个上面,为以后也提供方便。
文章图片
现有List
最后需求:
文章图片
其内的数据为每个node的id;
具体实现代码如下:
public class Node {
private String id;
private String pid;
private List
private int level;
........get,set, 构造方法;
}
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
import com.yyzq.entity.Node;
public class PoiTest {
static HashMap nodeMap = new HashMap();
static ArrayList le = new ArrayList();
static Set set = new HashSet();
/**
* 通过递归,遍历出每个Node
* @param nodes
*/
public static void test07241505(List
if(nodes.size() > 0){
for(int i=0;
i
//将每个node的id和他的Object保存到modeMap
nodeMap.put(nodes.get(i).getId(), nodes.get(i));
//保存每个node的id、level、和children到le
le.add(nodes.get(i).getId()+","+nodes.get(i).getLevel()+","+nodes.get(i).getChildren().size());
//保存所有的level到set,这里的set利用set集合不重复,为了找到具体的层级。
set.add(nodes.get(i).getLevel());
test07241505(nodes.get(i).getChildren());
}
}
}
}
public static void calculateData(List
test07241505(nodes);
HSSFWorkbook work = new HSSFWorkbook();
Sheet sheet = work.createSheet("sheet1");
List
Iterator its = set.iterator();
while(its.hasNext()){
list.add((Integer) its.next());
}
Collections.sort(list);
int rowCount = list.get(list.size()-1) + 2;
//总行数:最后一级因为children的size是0;所以没有加入,再加入标题栏的那行
int cellCount = 0;
//总列数
int levelNum = list.get(list.size()-1);
//找到倒数第二级的level
for(int i=le.size()-1;
i>-1;
i--){
String str1 = le.get(i);
String[] nodeArr = str1.split(",");
//length = 3,
if(Integer.parseInt(nodeArr[1]) == levelNum){//通过倒数第二级的level找到其children的size,并相加,得到最后一列的列数;
cellCount += Integer.parseInt(nodeArr[2]);
}
}
//创建每行每列;
for(int i=0;
i
for(int j=0;
j
}
}
sheet.addMergedRegion(new CellRangeAddress(0,0,0,cellCount-1));
Map map = new HashMap();
for(int j=list.size()-1;
j>-1;
j--){//遍历level,以为加入set,是唯一不重复;
int level = list.get(j);
int cellNum = 0;
for(int i=le.size()-1;
i>-1;
i--){//遍历List---ID + Level + children.size();
--->就是遍历除了最底层的node之外的每个node;
String str1 = le.get(i);
String[] nodeArr = str1.split(",");
//length = 3,
if(Integer.parseInt(nodeArr[1]) == level){//
if(j == list.size()-1){
Row row = sheet.getRow(level + 1);
sheet.getRow(level ).getCell(cellNum).setCellValue(nodeArr[0]);
sheet.addMergedRegion(new CellRangeAddress(level,level,cellNum,cellNum+Integer.parseInt(nodeArr[2])-1));
map.put(nodeArr[0], Integer.parseInt(nodeArr[2]));
List
for(int s=0;
s
}
cellNum += Integer.parseInt(nodeArr[2]);
}else{
Row row = sheet.getRow(level );
Cell cell = row.getCell(cellNum);
String ts = nodeArr[0];
row.getCell(cellNum).setCellValue(nodeArr[0]);
int tempCellNum = cellNum;
int nodeColumn = 0;
List
for(int s=0;
s
String id = tempNode.getId();
int size = map.get(id);
cellNum += size;
nodeColumn += size;
}
//System.out.println("+++++++++++++++++++++++"+cellNum);
sheet.addMergedRegion(new CellRangeAddress(level,level,tempCellNum,cellNum-1));
map.put(nodeArr[0], nodeColumn);
}
}
}
}
String fileName = "E:/a";
File file1 = new File(fileName);
if (!file1.exists()) {
file1.mkdirs();
}
File file = new File(fileName + "/test.xlsx");
FileOutputStream fileOut = new FileOutputStream(file);
work.write(fileOut);
work.close();
fileOut.close();
}
/**
* 构造假数据;
* @return
*/
public static List
List
int id = 0;
for(int i=0;
i<2;
i++){
Node node = new Node();
node.setId(String.valueOf(id));
id += 1;
node.setLevel(1);
List
for(int i1=0;
i1<2;
i1++){
Node node1 = new Node();
node1.setId(String.valueOf(id));
id += 1;
node1.setLevel(2);
List
for(int i2=0;
i2<2;
i2++){
Node node2 = new Node();
node2.setId(String.valueOf(id));
id += 1;
node2.setLevel(3);
List
for(int i3=0;
i3<2;
i3++){
Node node3 = new Node();
node3.setId(String.valueOf(id));
id += 1;
node3.setLevel(4);
List
for(int i4=0;
i4<3;
i4++){
Node node4 = new Node();
node4.setId(String.valueOf(id));
id += 1;
node4.setLevel(5);
nodes3.add(node4);
}
node3.setChildren(nodes3);
nodes2.add(node3);
}
node2.setChildren(nodes2);
nodes1.add(node2);
}
node1.setChildren(nodes1);
nodess.add(node1);
}
node.setChildren(nodess);
nodes.add(node);
}
return nodes;
}
public static void main(String[] args) throws IOException {
List
//System.out.println(list.size());
calculateData(list);
//test07241620();
//copyFile("E:\\assets","E:\\test");
}
}
保存node信息,map和list俩个有重复,可以做点筛选工作。自己选择。
Q/V/E : 554336412
【poi根据树型结构数据嵌套画Excel表格】微博:九道北
推荐阅读
- 记录iOS生成分享图片的一些问题,根据UIView生成固定尺寸的分享图片
- 运营是什么()
- ATAN2根据xy坐标计算角度
- 周检视5/14-5/21(第三周)
- Arcgis根据经纬度批量提取属性值
- 2018-11-29|2018-11-29 今早新闻| Chenie
- [记录]根据经纬度计算两点间的距离
- 【Flink】Flink手动触发savepoint失败问题
- 2021-02-25|2021-02-25 - 阅读营早会复盘
- 2020.1.4我的一天