导出下拉列表的两种小技巧【EasyPoi实战系列】- 第473篇

历史文章(文章累计460+)

国内最全的Spring Boot系列之一

国内最全的Spring Boot系列之二

国内最全的Spring Boot系列之三

国内最全的Spring Boot系列之四

国内最全的Spring Boot系列之五》

国内最全的Spring Boot系列之六

用Midjourney画个美女,AI绘画也太强大了!!! - 第8篇

【EasyPoi实战系列】Spring Boot使用EasyPoi实现多Sheet导出 - 第470篇

【EasyPoi实战系列】Spring Boot使用EasyPoi动态控制导出的列 - 第471篇100万数据导出,居然爆炸了OutOfMemoryError?【EasyPoi实战系列】- 第472篇

悟纤:师傅,在忙吗?

师傅:徒儿,何事?

悟纤:想请教师傅一个小小的问题。

师傅:那你这个小小的问题,5分钟可以搞定不?

悟纤:相信师傅的功力,要不了5分钟。

师傅:那你且说说看来着。

悟纤:就是我想在导出的单元格中,增加一个下拉的选项。

师傅:这个呀,使用了EasyPoi就特别简单,根本不是事,1分钟给你讲清楚。

悟纤:还的是师傅,那咱们马上开始吧~

导读

在实际的excel中,会有下拉的一个选项,供用户进行下拉修改下拉的选项。

对于这样的需求如何实现呢?

@Excel 加入 addressList 是否生成下拉的选项,默认false

目前下拉只支持replace和dict两个取值地方生成。

根据对应的值生成相应的下拉,xssf下拉rowMax = 100万,hssf下拉maxRow=65536,从数据第一行开始生成,使用方法也比较简单。

说明:本节的例子的导出实体类是基于前面的章节的实体类进行使用的,所以看的有点蒙圈的小伙伴可以查看前面的文章:

👇🏻👇🏻👇🏻EasyPoi实战系列

01.《【EasyPoi实战系列】Spring Boot集成EasyPoi - 第467篇》

02.《【EasyPoi实战系列】Spring Boot使用EasyPoi的注解让表格更漂亮以及图片的导出 - 第468篇》

03.《【EasyPoi实战系列】Spring Boot使用EasyPoi实现一对多的导出 - 第469篇》

04.《【EasyPoi实战系列】Spring Boot使用EasyPoi实现多Sheet导出 - 第470篇》

05.《【EasyPoi实战系列】Spring Boot使用EasyPoi动态控制导出的列 - 第471篇》

06.《100万数据导出,居然爆炸了OutOfMemoryError?【EasyPoi实战系列】- 第472篇》

一、下拉的生成方案一:replace+ addressList

第一种方案是最简单的实现方案,只需要添加一些配置即可:

@Excel(name = "性别",replace = { "男生_1", "女生_2" }, addressList = true)private Integer sex;

主要是replace和addressList这两个属性配置。

导出的结果如下:

在这里要注意下,这里就不能使用suffix这个属性了,如果是以下这个写法:

@Excel(name = "性别",replace = { "男_1", "女_2" }, suffix = "生", addressList = true)private Integer sex;

那么导出的结果是:

这里的suffix并不能作为下拉的选项后缀,这个是否是框架应该优化的一个点呢 ?

二、下拉的生成方案二:dict+ addressList

这种方案是使用属性dict,指定一个key,这里的key的逻辑是要实现一个接口IExcelDictHandler进行处理的。

(1)在注解中添加属性dict:

@Excel(name = "性别",dict = "sex",addressList = true)private Integer sex;

(2)实现接口IExcelDictHandler,添加dict=sex的字段信息:

package com.example.config;import cn.afterturn.easypoi.handler.inter.IExcelDictHandler;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;/** * */public class ExcelDiceAddressListHandlerImpl implements IExcelDictHandler {    /**     * 返回字典所有值     * key: dictKey     *     * @param dict 字典Key     * @return     */    @Override    public List<Map> getList(String dict) {        List<Map> list    = new ArrayList<>();        Map<String, String> dictMap = new HashMap<>();        dictMap.put("dictKey", "0");        dictMap.put("dictValue", "女孩子");        list.add(dictMap);        dictMap = new HashMap<>();        dictMap.put("dictKey", "1");        dictMap.put("dictValue", "男孩子");        list.add(dictMap);        return list;    }    @Override    public String toName(String dict, Object obj, String name, Object value) {        if ("sex".equals(dict)) {            int level = Integer.parseInt(value.toString());            switch (level) {                case 1:                    return "男孩子";                case 0:                    return "女孩子";            }        }        return null;    }    @Override    public String toValue(String dict, Object obj, String name, Object value) {        if ("sex".equals(dict)) {            int level = Integer.parseInt(value.toString());            switch (level) {                case 1:                    return "男孩子";                case 0:                    return "女孩子";            }        }        return null;    }}

(3)在导出的方法中,添加字段处理类:

ExportParams exportParams = new ExportParams(title, sheetName,ExcelType.XSSF);exportParams.setDictHandler(new ExcelDiceAddressListHandlerImpl());defaultExportX(list, pojoClass, fileName, response,exportParams);

这里核心的代码是:

exportParams.setDictHandler(new ExcelDiceAddressListHandlerImpl());

导出的结果:

我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。

à悟纤学院:https://t.cn/Rg3fKJD

学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!

SpringBoot视频:http://t.cn/A6ZagYTi

SpringBoot交流平台:https://t.cn/R3QDhU0

SpringSecurity5.0视频:http://t.cn/A6ZadMBe

ShardingJDBC分库分表:http://t.cn/A6ZarrqS

分布式事务解决方案:http://t.cn/A6ZaBnIr

JVM内存模型调优实战:http://t.cn/A6wWMVqG

Spring入门到精通:https://t.cn/A6bFcDh4

大话设计模式之爱你:https://dwz.cn/wqO0MAy7