EasyExcel 导出动态列

easyexcel导出(官方文档,https://easyexcel.opensource.alibaba.com/docs/current/)

导出动态列基于官方文档,思路是以JSON的形式,配置不固定动态表头导出

1、依赖

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.1</version>
        </dependency>

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.excel.util.MapUtils;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.TypeReference;

2、JSON报文

[
    {
        "A": "喝水",
        "B": "喝牛奶",
        "C": "虫子",
        "E": "吃羊肉"
    },
    {
        "A": "喝水2",
        "B": "喝牛奶2",
        "C": "虫子2",
        "E": "吃羊肉2"
    },
    {
        "A": "喝水3",
        "B": "喝牛奶3",
        "C": "虫子3",
        "E": "吃羊肉3"
    },
    {
        "A": "喝水4",
        "B": "喝牛奶4",
        "C": "虫子4",
        "E": "吃羊肉4"
    }
]


3、导出入口control

   @PostMapping(value = "/noModelWrite")
    public void noModelWrite(HttpServletResponse response) throws IOException {

        String str = "[\n" +
                "    {\n" +
                "        \"A\": \"喝水\",\n" +
                "        \"B\": \"喝牛奶\",\n" +
                "        \"C\": \"虫子\",\n" +
                "        \"E\": \"吃羊肉\"\n" +
                "    },\n" +
                "    {\n" +
                "        \"A\": \"喝水2\",\n" +
                "        \"B\": \"喝牛奶2\",\n" +
                "        \"C\": \"虫子2\",\n" +
                "        \"E\": \"吃羊肉2\"\n" +
                "    },\n" +
                "    {\n" +
                "        \"A\": \"喝水3\",\n" +
                "        \"B\": \"喝牛奶3\",\n" +
                "        \"C\": \"虫子3\",\n" +
                "        \"E\": \"吃羊肉3\"\n" +
                "    },\n" +
                "    {\n" +
                "        \"A\": \"喝水4\",\n" +
                "        \"B\": \"喝牛奶4\",\n" +
                "        \"C\": \"虫子4\",\n" +
                "        \"E\": \"吃羊肉4\"\n" +
                "    }\n" +
                "]";
        List<Map<String, String>> listMap = JSON.parseObject(str, new TypeReference<List<Map<String, String>>>() {
        });

        List<String> headList = listMap.stream().map(Map::keySet).flatMap(Collection::stream).distinct().collect(Collectors.toList());
        List<List<String>> headlists = headList.stream().map(e -> {
            List<String> list = new ArrayList<>();
            list.add(e);
            return list;
        }).collect(Collectors.toList());
        List<List<Object>> dataList = listMap.stream().map(e -> new ArrayList<Object>(e.values())).collect(Collectors.toList());
        String fileName =  "noModelWrite" + System.currentTimeMillis() + ".xlsx";
        writerExcel(fileName,headlists,dataList,response);
    }

4、导出工具

    /**
     * Excel导出操作
     */
    public static <T> void writerExcel(String fileName,
                                       List<List<String>> head,
                                       List<List<Object>> dataList,
                                       HttpServletResponse response
    ) throws IOException {
        try {
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止中文乱码
            fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
            // 这里需要设置不关闭流
            EasyExcel.write(response.getOutputStream())
                    .head(head)
                    .autoCloseStream(Boolean.FALSE)
                    .sheet("模板")
                    .doWrite(dataList);

        } catch (Exception e) {
            // 重置response
            response.reset();
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            Map<String, String> map = MapUtils.newHashMap();
            map.put("status", "failure");
            map.put("message", "下载文件失败" + e.getMessage());
            response.getWriter().println(JsonUtil.toJsonString(map));
        }
    }

以上代码直接复制在test中就可以运行

动态的数据转换成List<Map>,key是表头,value是值,外侧List的size代表着行数

可以将固定的数据与动态数据拼接在一起,达到动态列。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
如果你需要在导出Excel动态生成,可以使用EasyExcel的注解方式来实现。下面是一个简单的示例: 首先,定义一个实体类,用于存储动态的数据: ```java public class DynamicColumnData { @ExcelProperty("姓名") private String name; // 定义一个Map,用于存储动态的数据 @ExcelProperty(value = "动态", index = 1) private Map<String, String> dynamicColumns; // 省略 getter 和 setter } ``` 在该实体类中,我们使用了`@ExcelProperty`注解来指定Excel的名称和顺序。注意,在动态对应的字段上,我们使用了`Map`类型来存储动态的数据。 接下来,我们可以在代码中动态生成的数据,并将其存储到实体对象中,最后使用EasyExcel导出数据: ```java // 定义动态名 List<String> dynamicColumnNames = Arrays.asList("动态1", "动态2", "动态3"); // 构造实体对象 DynamicColumnData data = new DynamicColumnData(); data.setName("张三"); // 构造动态的数据 Map<String, String> dynamicColumns = new HashMap<>(); dynamicColumns.put("动态1", "动态1的数据"); dynamicColumns.put("动态2", "动态2的数据"); dynamicColumns.put("动态3", "动态3的数据"); data.setDynamicColumns(dynamicColumns); // 导出Excel ExcelWriter writer = EasyExcel.write("output.xlsx", DynamicColumnData.class).build(); WriteSheet sheet = EasyExcel.writerSheet("Sheet1").build(); writer.write(Arrays.asList(data), sheet); writer.finish(); ``` 在上述代码中,我们首先定义了动态名,然后构造了一个实体对象,并将动态的数据存储到`Map`对象中。最后,我们使用EasyExcel的API将数据导出Excel中。需要注意的是,在导出时,我们需要指定实体类的类型,以及Excel中的sheet名称。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值