easyexcel的动态表头和自定义转换器

依赖


、、、

        <dependency>

            <groupId>com.alibaba</groupId>

            <artifactId>easyexcel</artifactId>

            <version>2.2.6</version>

        </dependency>

、、、


普通web示例

/**

* 文件下载并且失败的时候返回json(默认失败了会返回一个有部分数据的Excel)

*/

@GetMapping("/v1/import")

public void downloadFailedUsingJson(HttpServletResponse response,FeedbackQuery feedbackQuery) throws IOException {

//查询数据

List<Feedback> list = feedbackService.listFeedbacks(feedbackQuery);

List<FeedbackImportVo> voList = list.stream().map(feedback -> {

FeedbackImportVo src = new FeedbackImportVo();

BeanUtils.copy(feedback,src);

return src;

}).collect(Collectors.toList());

// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman

try {

response.setContentType("application/vnd.ms-excel");

response.setCharacterEncoding("utf-8");

// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系

String fileName = URLEncoder.encode(String.format("用户反馈记录-%s", DateUtil.format(new Date(),"yyyy-MM-dd")), "UTF-8").replaceAll("\\+", "%20");

response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");

// 这里需要设置不关闭流

EasyExcel.write(response.getOutputStream(), FeedbackImportVo.class).autoCloseStream(Boolean.FALSE).sheet("用户反馈记录")

.doWrite(voList);

} catch (Exception e) {

// 重置response

response.reset();

response.setContentType("application/json");

response.setCharacterEncoding("utf-8");

Map<String, String> map = new HashMap<String, String>();

map.put("status", "failure");

map.put("message", "下载文件失败" + e.getMessage());

response.getWriter().println(JSON.toJSONString(map));

}

}


实体(用了自定义转换器)

/**

* @Auther: wxy

* @Date: 2020/11/11 16:50

* @Description:

*/

@Data

public class FeedbackImportVo implements Serializable {

    private static final long serialVersionUID = 8635674721036495183L;

    /**

    * 创建时间-反馈时间

    */

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")

    @ExcelProperty(index = 0, value = "反馈时间", converter = LocalDateTimeConverter.class)

    private LocalDateTime createTs;

    /**

    * 处理时间

    */

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")

    @ExcelProperty(index = 1, value = "处理时间", converter = LocalDateTimeConverter.class)

    private LocalDateTime updateTs;

    /**

    * 类别

    */

    @ExcelProperty(index = 2, value = "类别")

    private String catalogName;

    /**

    * 反馈人uid

    */

    @ExcelProperty(index = 3, value = "反馈人id", converter = LongStringConverter.class)

    private Long uid;

    /**

    * 反馈人昵称

    */

    @ExcelProperty(index = 4, value = "反馈人昵称")

    private String nickName;

    /**

    * 反馈人是否是vip 0=否|1=是

    */

    @ExcelProperty(index = 5, value = "vip")

    private Integer isVip;

    /**

    * 反馈人联系方式:手机号

    */

    @ExcelProperty(index = 6, value = "反馈人联系方式")

    private String mobile;

    /**

    * 反馈内容

    */

    @ExcelProperty(index = 7, value = "反馈内容")

    private String content;

    /**

    * 客户端

    */

    @ExcelProperty(index = 8, value = "客户端")

    private String deviceType;

    /**

    * 版本号

    */

    @ExcelProperty(index = 9, value = "版本号")

    private String version;

    /**

    * 渠道号

    */

    @ExcelProperty(index = 10, value = "渠道号")

    private String channel;

    /**

    * 手机型号

    */

    @ExcelProperty(index = 11, value = "手机型号")

    private String phoneModel;

    /**

    * 上传图片,最多5张

    */

    @ExcelProperty(index = 12, value = "图片")

    private String images;

    /**

    * 反馈状态:0=未处理|1=处理中|2=已处理 |3=暂不处理

    */

    @ExcelProperty(index = 13, value = "状态", converter = StatusConverter.class)

    private Integer status;

}


自定义转换器

package cn.jmfen.sport.backend.converter;

import com.alibaba.excel.converters.Converter;

import com.alibaba.excel.enums.CellDataTypeEnum;

import com.alibaba.excel.metadata.CellData;

import com.alibaba.excel.metadata.GlobalConfiguration;

import com.alibaba.excel.metadata.property.ExcelContentProperty;

import java.time.LocalDateTime;

import java.time.format.DateTimeFormatter;

/**

* @Auther: wxy

* @Date: 2020/11/11 17:45

* @Description:

*/

public class LocalDateTimeConverter implements Converter<LocalDateTime> {

    /**

    * java类型

    *

    * @return

    */

    @Override

    public Class<LocalDateTime> supportJavaTypeKey() {

        return LocalDateTime.class;

    }

    /**

    * excel数据类型

    *

    * @return

    */

    @Override

    public CellDataTypeEnum supportExcelTypeKey() {

        return CellDataTypeEnum.STRING;

    }

    /**

    * 导入

    * @param cellData

    * @param excelContentProperty

    * @param globalConfiguration

    * @return

    * @throws Exception

    */

    @Override

    public LocalDateTime convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {

        return LocalDateTime.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

    }

    /**

    * 导出

    * @param value

    * @param contentProperty

    * @param globalConfiguration

    * @return

    */

    @Override

    public CellData<String> convertToExcelData(LocalDateTime value, ExcelContentProperty contentProperty,

                                              GlobalConfiguration globalConfiguration) {

        return new CellData<>(value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

    }

}


package cn.jmfen.sport.backend.converter;

import com.alibaba.excel.converters.Converter;

import com.alibaba.excel.enums.CellDataTypeEnum;

import com.alibaba.excel.metadata.CellData;

import com.alibaba.excel.metadata.GlobalConfiguration;

import com.alibaba.excel.metadata.property.ExcelContentProperty;

/**

* @Auther: wxy

* @Date: 2020/11/11 18:01

* @Description:

*/

public class StatusConverter implements Converter<Integer> {

    @Override

    public Class<Integer> supportJavaTypeKey() {

        return Integer.class;

    }

    @Override

    public CellDataTypeEnum supportExcelTypeKey() {

        return CellDataTypeEnum.STRING;

    }

    @Override

    public Integer convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {

        return null;

    }

    @Override

    public CellData convertToExcelData(Integer integer, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {

        return new CellData(StatusEnum.getValue(integer));

    }

    enum StatusEnum {

        //反馈状态:0=未处理|1=处理中|2=已处理 |3=暂不处理

        UNTREATED(0, "未处理"),

        PROCESSING(1, "处理中"),

        PROCESSED(2, "已处理"),

        NOT_FOR_THE_TIME_BEING(3, "暂不处理");

        private Integer code;

        private String value;

        StatusEnum(Integer code, String value) {

            this.code = code;

            this.value = value;

        }

        public static String getValue(Integer code) {

            StatusEnum[] values = values();

            for (StatusEnum value : values) {

                if (value.code.equals(code)) {

                    return value.value;

                }

            }

            return "";

        }

    }

}


动态表头

    /**

    * 根据参数只导出指定列

    * <p>

    * 1. 创建excel对应的实体对象 参照{@link DemoData}

    * <p>

    * 2. 根据自己或者排除自己需要的列

    * <p>

    * 3. 直接写即可

    *

    * @since 2.1.1

    */

    @Test

    public void excludeOrIncludeWrite() {

        String fileName = TestFileUtil.getPath() + "excludeOrIncludeWrite" + System.currentTimeMillis() + ".xlsx";

        // 根据用户传入字段 假设我们要忽略 date

        Set<String> excludeColumnFiledNames = new HashSet<String>();

        excludeColumnFiledNames.add("date");

        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭

        EasyExcel.write(fileName, DemoData.class).excludeColumnFiledNames(excludeColumnFiledNames).sheet("模板")

            .doWrite(data());

        fileName = TestFileUtil.getPath() + "excludeOrIncludeWrite" + System.currentTimeMillis() + ".xlsx";

        // 根据用户传入字段 假设我们只要导出 date

        Set<String> includeColumnFiledNames = new HashSet<String>();

        includeColumnFiledNames.add("date");

        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭

        EasyExcel.write(fileName, DemoData.class).includeColumnFiledNames(includeColumnFiledNames).sheet("模板")

            .doWrite(data());

    }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容