EasyExcel JSON数据多级表头导出

最近在学习使用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" +
                "}";
    }

}

结果:
导出excel结果

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用EasyExcel来实现多级表头导出EasyExcel是一个基于Java的简单易用的Excel操作工具,支持大数据量的导入导出操作。 下面是一个示例代码,演示了如何实现多级表头导出: ```java // 创建一个excel写对象 ExcelWriter writer = EasyExcel.write("output.xlsx").build(); // 定义表头数据 List<List<String>> head = new ArrayList<>(); // 第一行表头 List<String> headRow1 = new ArrayList<>(); headRow1.add("一级表头"); headRow1.add("一级表头"); headRow1.add("一级表头"); head.add(headRow1); // 第二行表头 List<String> headRow2 = new ArrayList<>(); headRow2.add("二级表头"); headRow2.add("二级表头"); headRow2.add("二级表头"); head.add(headRow2); // 第三行表头 List<String> headRow3 = new ArrayList<>(); headRow3.add("三级表头"); headRow3.add("三级表头"); headRow3.add("三级表头"); head.add(headRow3); // 写入表头数据 Sheet sheet = new Sheet(1, 0); sheet.setHead(head); writer.write1(null, sheet); // 写入内容数据(省略) // 关闭excel写对象 writer.finish(); ``` 在上面的示例代码中,我们创建了一个ExcelWriter对象,并指定了输出文件名为"output.xlsx"。然后,我们定义了一个包含多级表头表头数据,每一级的表头都是一个List<String>。我们将这些表头数据添加到head列表中,然后使用Sheet对象将head列表设置为excel的表头。最后,调用writer的write1方法写入表头数据。 你可以根据需要修改示例代码中的表头数据,然后使用EasyExcel提供的其他方法写入内容数据。完成后,调用writer的finish方法关闭excel写对象即可。 希望对你有帮助!如果还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值