最近在学习使用easyExcel,刚好看到有人问了个问题
代码解决如下
package com.wwj.test.web.uitl;
import com.alibaba.excel.EasyExcel;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
/**
* @author: wuwenjun
* @since 2022-06-07
*/
public class ReadJson {
public static void main(String[] args) {
String data = getDataString();
JSONObject jsonObject = JSONObject.parseObject(data);
//读取
JSONObject jsonObject1 = jsonObject.getJSONObject("data");
JSONArray jsonArray = jsonObject1.getJSONArray("headerNodes");
List<JsonData> list = jsonArray.toJavaList(JsonData.class);
String fileName = "C:\\Users\\win10\\Desktop\\write" + System.currentTimeMillis() + ".xlsx";
// 这里 需要指定写用哪个class去读,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
// 如果这里想使用03 则 传入excelType参数即可
EasyExcel.write(fileName).head(head(list)).sheet("模板").doWrite(data());
}
private static List<List<String>> head(List<JsonData> data) {
List<List<String>> result = new ArrayList<>();
List<String> temp = new ArrayList<>();
// 深度优先搜索 使用递归
for (JsonData jsonData : data) {
dfs(result, jsonData, temp);
}
return result;
}
private static void dfs(List<List<String>> result, JsonData jsonData, List<String> temp) {
List<JsonData> datas = jsonData.getChildren();
temp.add(jsonData.getName());
if (CollectionUtils.isEmpty(datas)) {
//看似浅复制,其实是深复制
List<String> head = new ArrayList<>(temp);
result.add(head);
} else {
for (JsonData data : datas) {
dfs(result, data, temp);
}
}
// 移除最后一个
temp.remove(temp.size() - 1);
}
private static List<List<String>> data() {
return new ArrayList<>();
}
static class JsonData {
private String code;
private List<JsonData> children;
private String parentCode;
private String name;
public void setCode(String code) {
this.code = code;
}
public void setChildren(List<JsonData> children) {
this.children = children;
}
public void setParentCode(String parentCode) {
this.parentCode = parentCode;
}
public void setName(String name) {
this.name = name;
}
public String getCode() {
return code;
}
public List<JsonData> getChildren() {
return children;
}
public String getParentCode() {
return parentCode;
}
public String getName() {
return name;
}
}
private static String getDataString() {
return "{\n" +
" \"code\":200,\n" +
" \"data\":{\n" +
" \"headerNodes\":[\n" +
" {\n" +
" \"children\":[\n" +
" {\n" +
" \"code\":\"salesRegionName\",\n" +
" \"name\":\"大区\",\n" +
" \"parentCode\":\"-1\"\n" +
" },\n" +
" {\n" +
" \"code\":\"cityName\",\n" +
" \"name\":\"城市\",\n" +
" \"parentCode\":\"-1\"\n" +
" },\n" +
" {\n" +
" \"code\":\"salesModelDesc\",\n" +
" \"name\":\"门店模式\",\n" +
" \"parentCode\":\"-1\"\n" +
" },\n" +
" {\n" +
" \"code\":\"terminalNo\",\n" +
" \"name\":\"门店编码\",\n" +
" \"parentCode\":\"-1\"\n" +
" },\n" +
" {\n" +
" \"code\":\"terminalName\",\n" +
" \"name\":\"门店名称\",\n" +
" \"parentCode\":\"-1\"\n" +
" }\n" +
" ],\n" +
" \"code\":\"-1\",\n" +
" \"name\":\"终端信息\"\n" +
" },\n" +
" {\n" +
" \"children\":[\n" +
" {\n" +
" \"children\":[\n" +
" {\n" +
" \"code\":\"LSE0001\",\n" +
" \"name\":\"前台零售额\",\n" +
" \"parentCode\":\"JY\"\n" +
" },\n" +
" {\n" +
" \"code\":\"SRA0001\",\n" +
" \"name\":\"销售收入(含税)\",\n" +
" \"parentCode\":\"JY\"\n" +
" },\n" +
" {\n" +
" \"code\":\"TAX0001\",\n" +
" \"name\":\"不含税扣点\",\n" +
" \"parentCode\":\"JY\"\n" +
" },\n" +
" {\n" +
" \"code\":\"SRB0001\",\n" +
" \"name\":\"销售收入\",\n" +
" \"parentCode\":\"JY\"\n" +
" },\n" +
" {\n" +
" \"code\":\"FLE0001\",\n" +
" \"name\":\"返利\",\n" +
" \"parentCode\":\"JY\"\n" +
" },\n" +
" {\n" +
" \"code\":\"JSR0001\",\n" +
" \"name\":\"净收入\",\n" +
" \"parentCode\":\"JY\"\n" +
" },\n" +
" {\n" +
" \"code\":\"CBE0001\",\n" +
" \"name\":\"成本\",\n" +
" \"parentCode\":\"JY\"\n" +
" },\n" +
" {\n" +
" \"code\":\"MLL0001\",\n" +
" \"name\":\"毛利额\",\n" +
" \"parentCode\":\"JY\"\n" +
" },\n" +
" {\n" +
" \"code\":\"LRA0001\",\n" +
" \"name\":\"利润\",\n" +
" \"parentCode\":\"JY\"\n" +
" },\n" +
" {\n" +
" \"code\":\"LRC0001\",\n" +
" \"name\":\"直接利润\",\n" +
" \"parentCode\":\"JY\"\n" +
" },\n" +
" {\n" +
" \"code\":\"LRB0001\",\n" +
" \"name\":\"净利润\",\n" +
" \"parentCode\":\"JY\"\n" +
" }\n" +
" ],\n" +
" \"code\":\"JY\",\n" +
" \"name\":\"经营收入\",\n" +
" \"parentCode\":\"STORE\"\n" +
" },\n" +
" {\n" +
" \"children\":[\n" +
" {\n" +
" \"code\":\"RYF0001\",\n" +
" \"name\":\"固定薪资\",\n" +
" \"parentCode\":\"RYF\"\n" +
" },\n" +
" {\n" +
" \"code\":\"RYF0002\",\n" +
" \"name\":\"绩效工资\",\n" +
" \"parentCode\":\"RYF\"\n" +
" },\n" +
" {\n" +
" \"code\":\"RYF0003\",\n" +
" \"name\":\"星级补贴\",\n" +
" \"parentCode\":\"RYF\"\n" +
" },\n" +
" {\n" +
" \"code\":\"RYF0004\",\n" +
" \"name\":\"社保\",\n" +
" \"parentCode\":\"RYF\"\n" +
" },\n" +
" {\n" +
" \"code\":\"RYF0005\",\n" +
" \"name\":\"公积金\",\n" +
" \"parentCode\":\"RYF\"\n" +
" },\n" +
" {\n" +
" \"code\":\"RYF0006\",\n" +
" \"name\":\"其他\",\n" +
" \"parentCode\":\"RYF\"\n" +
" },\n" +
" {\n" +
" \"code\":\"RYF0007\",\n" +
" \"name\":\"导购员常规提成\",\n" +
" \"parentCode\":\"RYF\"\n" +
" },\n" +
" {\n" +
" \"code\":\"RYF0000\",\n" +
" \"name\":\"促销人员费合计\",\n" +
" \"parentCode\":\"RYF\"\n" +
" }\n" +
" ],\n" +
" \"code\":\"RYF\",\n" +
" \"name\":\"促销人员\",\n" +
" \"parentCode\":\"STORE\"\n" +
" },\n" +
" {\n" +
" \"children\":[\n" +
" {\n" +
" \"code\":\"JCF0001\",\n" +
" \"name\":\"进场费\",\n" +
" \"parentCode\":\"JCF\"\n" +
" },\n" +
" {\n" +
" \"code\":\"JCF0000\",\n" +
" \"name\":\"进场费合计\",\n" +
" \"parentCode\":\"JCF\"\n" +
" }\n" +
" ],\n" +
" \"code\":\"JCF\",\n" +
" \"name\":\"进场费用\",\n" +
" \"parentCode\":\"STORE\"\n" +
" },\n" +
" {\n" +
" \"children\":[\n" +
" {\n" +
" \"code\":\"ZXF0001\",\n" +
" \"name\":\"装修费\",\n" +
" \"parentCode\":\"ZXF\"\n" +
" },\n" +
" {\n" +
" \"code\":\"ZXF0000\",\n" +
" \"name\":\"装修费合计\",\n" +
" \"parentCode\":\"ZXF\"\n" +
" }\n" +
" ],\n" +
" \"code\":\"ZXF\",\n" +
" \"name\":\"装修费用\",\n" +
" \"parentCode\":\"STORE\"\n" +
" },\n" +
" {\n" +
" \"children\":[\n" +
" {\n" +
" \"code\":\"YJF0001\",\n" +
" \"name\":\"样机费\",\n" +
" \"parentCode\":\"YJF\"\n" +
" },\n" +
" {\n" +
" \"code\":\"YJF0000\",\n" +
" \"name\":\"样机费用合计\",\n" +
" \"parentCode\":\"YJF\"\n" +
" }\n" +
" ],\n" +
" \"code\":\"YJF\",\n" +
" \"name\":\"样机费用\",\n" +
" \"parentCode\":\"STORE\"\n" +
" },\n" +
" {\n" +
" \"children\":[\n" +
" {\n" +
" \"code\":\"RYF0008\",\n" +
" \"name\":\"销售奖励\",\n" +
" \"parentCode\":\"SJL\"\n" +
" },\n" +
" {\n" +
" \"code\":\"SJL0000\",\n" +
" \"name\":\"销售奖励合计\",\n" +
" \"parentCode\":\"SJL\"\n" +
" }\n" +
" ],\n" +
" \"code\":\"SJL\",\n" +
" \"name\":\"销售奖励\",\n" +
" \"parentCode\":\"STORE\"\n" +
" },\n" +
" {\n" +
" \"children\":[\n" +
" {\n" +
" \"code\":\"CXF0001\",\n" +
" \"name\":\"赠品费\",\n" +
" \"parentCode\":\"CXF\"\n" +
" },\n" +
" {\n" +
" \"code\":\"CXF0002\",\n" +
" \"name\":\"广告费\",\n" +
" \"parentCode\":\"CXF\"\n" +
" },\n" +
" {\n" +
" \"code\":\"CXF0003\",\n" +
" \"name\":\"物料费\",\n" +
" \"parentCode\":\"CXF\"\n" +
" },\n" +
" {\n" +
" \"code\":\"CXF0004\",\n" +
" \"name\":\"导购激励费\",\n" +
" \"parentCode\":\"CXF\"\n" +
" },\n" +
" {\n" +
" \"code\":\"CXF0005\",\n" +
" \"name\":\"渠道促销费\",\n" +
" \"parentCode\":\"CXF\"\n" +
" },\n" +
" {\n" +
" \"code\":\"CXF0006\",\n" +
" \"name\":\"门店促销费\",\n" +
" \"parentCode\":\"CXF\"\n" +
" },\n" +
" {\n" +
" \"code\":\"CXF0007\",\n" +
" \"name\":\"其他杂费\",\n" +
" \"parentCode\":\"CXF\"\n" +
" },\n" +
" {\n" +
" \"code\":\"CXF0000\",\n" +
" \"name\":\"促销费合计\",\n" +
" \"parentCode\":\"CXF\"\n" +
" }\n" +
" ],\n" +
" \"code\":\"CXF\",\n" +
" \"name\":\"促销费\",\n" +
" \"parentCode\":\"STORE\"\n" +
" },\n" +
" {\n" +
" \"children\":[\n" +
" {\n" +
" \"code\":\"FTF0001\",\n" +
" \"name\":\"大区运营费用\",\n" +
" \"parentCode\":\"FTA\"\n" +
" },\n" +
" {\n" +
" \"code\":\"FTF0002\",\n" +
" \"name\":\"线下总部职能费用\",\n" +
" \"parentCode\":\"FTA\"\n" +
" },\n" +
" {\n" +
" \"code\":\"FTF0003\",\n" +
" \"name\":\"直接费用分摊\",\n" +
" \"parentCode\":\"FTA\"\n" +
" },\n" +
" {\n" +
" \"code\":\"FTF0000\",\n" +
" \"name\":\"分摊费用合计\",\n" +
" \"parentCode\":\"FTA\"\n" +
" }\n" +
" ],\n" +
" \"code\":\"FTA\",\n" +
" \"name\":\"直接分摊\",\n" +
" \"parentCode\":\"STORE\"\n" +
" },\n" +
" {\n" +
" \"children\":[\n" +
" {\n" +
" \"code\":\"FTF0004\",\n" +
" \"name\":\"间接费用分摊\",\n" +
" \"parentCode\":\"FTB\"\n" +
" }\n" +
" ],\n" +
" \"code\":\"FTB\",\n" +
" \"name\":\"间接分摊\",\n" +
" \"parentCode\":\"STORE\"\n" +
" }\n" +
" ],\n" +
" \"code\":\"STORE\",\n" +
" \"name\":\"线下终端\"\n" +
" }\n" +
" ]\n" +
" },\n" +
" \"message\":\"success\"\n" +
"}";
}
}
结果: