写一个easyexcel的工具类

本文介绍了基于阿里开源项目EasyExcel的工具类封装,主要功能包括:通过注解建立excel与Java模型映射、导出和读取excel。文章提供相关API介绍及示例,并给出了注意事项,如模型类需有无参构造器等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 前言

最近阿里开源的excel读写项目EasyExcel又火了起来 . 原来是项目又开始维护了, 从1.x 更新到2.x 了 , 而且迭代迅速 , 目前已经更新到 2.1.0-beta3 版本.

关于easyexcel , 其主要目的为降低读取excel时的内存损耗 , 简化读写excel的api .

同时2.x版本提供了很多新功能 , 具体大家可以直接参考官方说明吧 , github文档上写十分详细 (中文) , 这里就不传播一些没啥必要的二三手知识了 , 而且目前该项目还在不停地迭代 , 给contributor一个star也是很有必要的 . 😄

官方地址 : easyexcel仓库地址 , easyexcel官网


这里我基于easyexcel 2.0.5版本简单封装了一个web读写excel的工具类 , 主要封装了如下功能 :

  • 通过注解自定义LocalDateTime的读写格式

  • 通过注解自定义枚举类型的读写格式

  • 自定义BaseExcelListener抽象类封装了常用的数据处理逻辑 , 以及补充读取excel过程中读取发生错误被跳过的行号记录 .

  • 封装了web的读写excel操作

下面列举主要功能以及相关示例 , 可以直接看源码 , 每个方法都有写完整的注释 , 如果觉得写得还凑合能看的话 , 给我这个刚毕业没多久的小菜鸡点个star呗 😄

附上源码地址 : https://github.com/aStudyMachine/easyexcel-utils

2. 主要功能

2.1 建立excel表每行数据与Java模型的映射

easyexcel读写excel可以基于java 模型的方式 , 也可以使用List<List<String>> 的方式读写excel , 这里我读写操作使用基于java模型的方式 , 通过java类的属性与excel每一列的数据进行对应

注解 : @ExcelProperty ,

具体如何使用注解建立java模型与Excel表数据的映射可以参考 com.wukun.module.easyexcel.pojo下的两个java模型类Order 类与User

/**
 * @author WuKun
 * @since 2019/10/09
 */
@Data
@AllArgsConstructor
@NoArgsConstructor //必须要保证无参构造方法存在,否则会报初始化对象失败
public class User {
   
   

    /**
     * {@code @ExcelIgnore} 用于标识该字段不用做excel读写过程中的数据转换
     */
    @ExcelIgnore
    private Integer userId;

    /**
     * <pre>
     * {@code @ExcelIgnore} 中的属性 不建议 index 和 name 同时用
     *
     * 要么一个对象统一只用index表示列号,
     * 例如 : {@code @ExcelProperty(index = 0)}
     *
     * 要么一个对象统一只用value去匹配列名
     * 例如 : {@code @ExcelProperty("姓名")}
     *
     * 用名字去匹配,这里需要注意,如果名字重复,会导致只有一个字段读取到数据
     * </pre>
     */
    @ExcelProperty("姓名")
    private String name;

    @ExcelProperty("年龄")
    private Integer age;

    @ExcelProperty("地址")
    private String address;

    /**
     * <pre>
     * {@code @EnumFormat} 注解 :
     *  作用 : 与 {@code @ExcelProperty(converter = EnumExcelConverter.class)} 搭配使用
     *         转换java枚举与excel中指定的内容
     *  属性 :
     *   - value : 要转换的枚举类class对象
     *   - fromExcel : 指定excel中用户输入的枚举值的名字的字符串形式,与toJavaEnum中指定的枚举值一一对应
     *                 以下面的示例来说,fromExcel指定的 "男" 对应 toJavaEnum中的 "MAN" ,
     *                 当excel中该列读取到"男" 这个字符串时,会自动转化为枚举{@code GenderEnum.MAN},
     *                 同理在写excel时,如果该字段为{@code GenderEnum.MAN} 时, 写到excel时则转化为 "男"
     *   - toJavaEnum : 如上所述
     *
     *  注意 : fromExcel 与 toJavaEnum 这两个属性必须同时使用, 而且两个属性的字符串的数组长度必须相同,
     *        若两个属性都不指定 , 则默认 枚举值名字符串转化为对应的枚举 例如: "MAN" <--> {@code GenderEnum.MAN}
     * </pre>
     */
    @EnumFormat(value = GenderEnum.class,
            fromExcel = {
   
   "男", "女"},
            toJavaEnum = {
   
   "MAN", "WOMAN"}) // "男" <--> GenderEnum.MAN ; "女" <--> GenderEnum.WOMAN
    @ExcelProperty(value = "性别", converter = EnumExcelConverter.class)
    private GenderEnum gender;

    /**
     * <pre>
     * {@code @LocalDateTimeFormat} 注解
     *  作用: 与 {@code  @ExcelProperty(converter = LocalDateTimeExcelConverter.class)} 搭配使用,
     *        指定导入导出的时间格式.
     *  属性 :
     *   - value : 日期格式字符串 
     * </pre>
     */
    @ExcelProperty(value = "生日", converter = LocalDateTimeExcelConverter.class)
    @LocalDateTimeFormat("yyyy-MM-dd HH:mm:ss")
    private LocalDateTime birthday;
}

2.2 导出excel

2.2.1 相关API介绍

web导出excel 根据03 / 07版本分为两个不同的方法 ,分别为EasyExcelUtil类中以下两个方法 :

  • 导出03版本 : exportExcel2003Format(EasyExcelParams excelParams)

  • 导出07版本 : exportExcel2007Format(EasyExcelParams excelParams)

EasyExcelParams是使用EasyExcel导出excel需要设置的相关参数 , 包括需要导出的List<T>数据以及对应的Java模型 , 使用时根据实际情况设置相应的参数即可.

/**
 * @author WuKun
 * @since 2019/10/14
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class EasyExcelParams implements Serializable {
   
   


    
你可以使用阿里巴巴的 `EasyExcel` 工具类来读 Excel 文件,以下是一个简单的示例: 1. 首先,你需要在你的项目中添加 `easyexcel` 的依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.10</version> </dependency> ``` 2. 然后,你可以编一个工具类,例如 `ExcelUtils`: ```java import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.read.builder.ExcelReaderBuilder; import com.alibaba.excel.write.builder.ExcelWriterBuilder; import com.alibaba.excel.write.metadata.WriteSheet; import java.io.InputStream; import java.io.OutputStream; import java.util.List; public class ExcelUtils { /** * 读取 Excel 文件 * @param inputStream Excel 文件输入流 * @param clazz 数据类型 * @return 数据列表 */ public static <T> List<T> readExcel(InputStream inputStream, Class<T> clazz) { ExcelReaderBuilder builder = EasyExcel.read(inputStream, clazz, null); return builder.sheet().doReadSync(); } /** * Excel 文件 * @param outputStream Excel 文件输出流 * @param clazz 数据类型 * @param data 数据列表 */ public static <T> void writeExcel(OutputStream outputStream, Class<T> clazz, List<T> data) { ExcelWriterBuilder builder = EasyExcel.write(outputStream, clazz); ExcelWriter writer = builder.build(); WriteSheet sheet = EasyExcel.writerSheet().build(); writer.write(data, sheet); writer.finish(); } } ``` 3. 然后你就可以在你的程序中调用 `ExcelUtils` 来读 Excel 文件了: ```java // 读取 Excel 文件 List<User> userList = ExcelUtils.readExcel(new FileInputStream("users.xlsx"), User.class); // Excel 文件 List<User> userList = new ArrayList<>(); ExcelUtils.writeExcel(new FileOutputStream("users.xlsx"), User.class, userList); ``` 其中,`User` 是你自定义的数据类型,需要实现 `com.alibaba.excel.annotation.ExcelProperty` 接口来指定 Excel 文件中每列数据的属性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值