目录

一、应用场景

二、环境准备

三、实体类设计

四、数据导出实战

五、数据导入实战

六、高级特性应用

七、性能优化建议

八、异常处理方案

九、结语


一、应用场景

在Java开发中,Excel数据导入导出是高频需求(如报表生成、数据迁移)。传统POI API操作繁琐,而 EasyExcel 框架的 @ExcelProperty 注解可大幅简化流程!核心优势:
✅ 注解驱动:通过注解自动匹配字段与表头
✅ 零模板代码:无需手动处理单元格坐标
✅ 高性能:基于SAX模式解析,内存占用低

二、环境准备

依赖配置(Maven):

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.3.4</version>
</dependency>

三、实体类设计

使用 @ExcelProperty 绑定表头与字段:

@Data
public class User {
    @ExcelProperty("用户ID") 
    private Long id;
    
    @ExcelProperty(value = "用户名", index = 1) // index指定列顺序
    private String name;
    
    @ExcelProperty(value = {"联系信息", "邮箱"}) // 支持多级表头
    private String email;
    
    @ExcelIgnore // 不参与导入导出
    private String password;
}

四、数据导出实战

步骤

  1. 准备数据集合
  2. 设置导出路径
  3. 调用 EasyExcel.write()
List<User> users = Arrays.asList(
    new User(1L, "张三", "zhang@example.com"),
    new User(2L, "李四", "li@example.com")
);

String fileName = "export.xlsx";
EasyExcel.write(fileName, User.class)
    .sheet("用户数据")
    .doWrite(users);

Web环境导出时需设置响应头:

response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + URLEncoder.encode("导出.xlsx", "UTF-8"));

五、数据导入实战

方法一:

        步骤:

               1.创建监听器 AnalysisEventListener

               2.重写 invoke() 逐行处理

               3.调用 EasyExcel.read()

public class UserDataListener extends AnalysisEventListener<User> {
   private final List<User> cachedList = new ArrayList<>();

    @Override
    public void invoke(User user, AnalysisContext context) {
        cachedList.add(user); // 单行数据捕获
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        saveToDatabase(cachedList); // 所有数据解析完成后入库
    }

    //业务代码,自行处理
    private void saveToDatabase(List<User> cachedList) {
        userMapper.batchInsert(cachedList);
    }
}

启动导入只需指定文件路径和监听器:

EasyExcel.read("import.xlsx", User.class, new UserDataListener())
    .sheet()
    .doRead();

方法二:

        直接业务代码转换并保存,无需使用监听器

@PostMapping("/import")
public void importDataManage(@RequestParam MultipartFile file) throws IOException {
    InputStream inputStream = file.getInputStream();
    List<User> users = EasyExcel.read(inputStream)
                .head(User.class)
                .sheet() // 设置sheet,默认读取第一个
                .headRowNumber(1) // 设置标题所在行数
                .doReadSync();

    //对users进行处理即可
}

六、高级特性应用

日期格式处理:

@ExcelProperty("注册日期")
@DateTimeFormat("yyyy年MM月dd日")
private Date registerDate;

动态表头生成:

List<List<String>> head = Arrays.asList(
    Arrays.asList("基本信息", "用户ID"),
    Arrays.asList("基本信息", "用户名"),
    Arrays.asList("联系信息", "手机号")
);

EasyExcel.write(fileName)
    .head(head)
    .sheet()
    .doWrite(dataList);

七、性能优化建议

对于百万级数据:

  • 导出时使用ExcelWriterBuilder.registerWriteHandler添加AbstractRowHeightStyleStrategy避免内存堆积
  • 导入时配置ReadListener实现分批次处理
  • 设置autoCloseStream=true确保资源释放

八、异常处理方案

常见问题应对:

  • 乱码问题:确保所有环节使用UTF-8编码
  • 类型转换失败:实现Converter<T>接口自定义转换逻辑
  • 内存溢出:通过ReadCache参数控制缓存大小
EasyExcel.read(inputStream, User.class, listener)
    .readCache(new MapCache(1024)) // 设置缓存行数
    .sheet()
    .doRead();

九、结语

通过 @ExcelProperty + EasyExcel,代码量减少70%,同时规避了POI的内存溢出风险。无论是百万级数据导出,还是复杂表头导入,都能轻松应对!

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐