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 优先级高于valueorder,会根据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最小的值,导出到第一列依次往后。

相关推荐
GISer_Jing6 分钟前
前端营销技术实战:数据+AI实战指南
前端·javascript·人工智能
未若君雅裁14 分钟前
JVM面试篇总结
java·jvm·面试
GIS之路25 分钟前
使用命令行工具 ogr2ogr 将 CSV 转换为 Shp 数据(二)
前端
kk哥889934 分钟前
C++ 对象 核心介绍
java·jvm·c++
嘉琪00138 分钟前
Vue3+JS 高级前端面试题
开发语言·前端·javascript
招风的黑耳44 分钟前
我用SpringBoot撸了一个智慧水务监控平台
java·spring boot·后端
xunyan623444 分钟前
面向对象(下)-接口的理解
java·开发语言
程序员游老板1 小时前
基于SpringBoot3+vue3的爱心陪诊平台
java·spring boot·毕业设计·软件工程·课程设计·信息与通信
期待のcode1 小时前
Springboot核心构建插件
java·spring boot·后端
遥不可及~~斌1 小时前
Java 面试题集 -- 001
java·开发语言