EasyExcel的应用

一、简单使用

引入依赖:

这里我们可以使用最新的4.0.2版本,也可以选择之前的稳定版本,3.1.x以后的版本API大致相同,新的版本也会向前兼容(3.1.x之前的版本,部分API可能在高版本被废弃),关于POI、JDK版本适配问题,具体可参考官网-版本说明。

XML 复制代码
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>easyexcel</artifactId>
        <version>4.0.2</version>
    </dependency>

下载excel文件:

java 复制代码
    @GetMapping("/download")
    public void excelDownload(HttpServletResponse response) throws IOException {
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        EasyExcel.write(response.getOutputStream(), Data.class).sheet("模板").doWrite(datas);
        String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
    }

读取excel文件:

java 复制代码
    @PostMapping("/read")
    public void read(MultipartFile file) throws IOException {
        
          1、这只是简单演示,一般不使用 doReadSync 方法,
             此方法同步执行的,即它会阻塞当前线程,直到读取完整个Excel文件并返回所有数据。
             读取大型文件时,可能会导致程序响应变慢或阻塞。
          2、使用head映射字段时,该实体类上不能加 @Accessors 注解,加上此注解
             会字段映射不成功。
          3、一般会使用监听器 + doRead 方法实现excel文件的读取
        List<Data> datas = EasyExcel.read(file.getInputStream()).sheet().head(Data.class).doReadSync();
        System.out.println(datas);
    }

二、常用注解

1、@ExcelProperty注解

这个注解应该是最常用的注解,通常用来映射字段跟excel的列名,有以下几个属性:

名称 默认值 描述
value 空 用于匹配excel中的头,必须全匹配,如果有多行头,会匹配最后一行头
order Integer.MAX_VALUE 优先级高于value,会根据order的顺序来匹配实体和excel中数据的顺序
index -1 优先级高于value和order,会根据index直接指定到excel中具体的哪一列
converter 自动选择 指定当前字段用什么转换器,默认会自动选择。写的情况下只要实现com.alibaba.excel.converters.Converter#convertToExcelData(com.alibaba.excel.converters.WriteConverterContext<T>) 方法即可

注意:

1、如果没有特殊的调整一般,使用value属性就够了,在读取或者导出时都能匹配或者映射为对应的列名。

2、value 跟 index 可以在导出数据的时候配合使用,value指定列名,index指定该列的顺序,例如:

复制代码
    @ExcelProperty(value = "性别",index = 3) 代表列名为 性别,导出到第三列的位置。
    但是在导入时,如果设置了order属性,表示会根据指定列来匹配字段,例如上面就会将第三列匹配为性别字段,如果该列字段为空,或者字段类型不匹配就会报错,一般在读取数据时不会这么使用这个属性。

3、order 属性代表按顺序匹配,比如说导出数据时,会按照字段上该属性的顺序,一次为列设置对应字段的值,比如order最小的,就匹配第一列的值,依次往后,在导出时也是一样,order最小的值,导出到第一列依次往后。

相关推荐
惊讶的猫几秒前
Spring AOP
java·开发语言
李纲明几秒前
微信小程序 web-view 打开空白或提示未配置业务域名:校验文件、HTTPS 与跳转域名排查
前端·微信小程序·https·web-view·小程序开发·业务域名
涛涛ing7 分钟前
一个框架为了“不水合”,把HTML注释都删了
前端
用户3126874877207 分钟前
Java 异常体系全链路:受检异常到底该不该用
java
学到老活到老21 分钟前
集合换成线程安全的,就不用加锁了吗?
java·面试
Wang's Blog27 分钟前
Java 项目实战: 交友项目 - 今日佳人:需求分析
java·开发语言·交友
计算机魔术师30 分钟前
AI渗透框架3小时破云,中国黑客组织正在升级打法
前端
蒲公英内测分发32 分钟前
智能手环出海测试,海外合作方分散在不同国家,Android 测试包怎么持续分发和更新?
android·前端·人工智能·测试工具·智能手表
朱涛的自习室39 分钟前
高价软件已死,我让 AI 开启了「平替计划」(Day 7 / 7)
android·前端·github
余额瞒着我当琳44 分钟前
C++11,发展历史浅谈,初始化列表和对象初始化,右值引用和移动语义
java·开发语言·c++·算法