Java开发者谁还没用过EasyExcel处理Excel文件呢?轻量、低内存的优势让它成为项目首选!但自从EasyExcel宣布停止维护后😮,不少小伙伴可能担心后续迭代问题。然而,原作者带着升级版框架FastExcel强势回归🌟!完全兼容EasyExcel的所有功能,迁移成本几乎为零。
首先在pom.xml中引入FastExcel依赖,同时搭配SpringBoot基础依赖(非必须,纯Java项目可省略):
<!-- FastExcel核心依赖 --><dependency> <groupId>cn.idev.excel</groupId> <artifactId>fastexcel</artifactId> <version>1.3.0</version></dependency><!-- SpringBoot Web依赖(用于接口测试) --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId></dependency>使用@ExcelProperty注解绑定Excel列名,和EasyExcel的用法完全一致:
import cn.idev.excel.annotation.ExcelProperty;import lombok.Data;@Datapublic class User { @ExcelProperty("主键") // 对应Excel表头"主键" private Integer id; @ExcelProperty("姓名") // 对应Excel表头"姓名" private String name; @ExcelProperty("年龄") // 对应Excel表头"年龄" private Integer age;}FastExcel通过事件监听器实现逐行读取,避免大文件内存溢出:
import cn.idev.excel.context.AnalysisContext;import cn.idev.excel.event.AnalysisEventListener;import java.util.ArrayList;import java.util.List;/** * 通用Excel监听器,支持泛型 */public class BaseExcelListener<T> extends AnalysisEventListener<T> { // 存储读取到的数据列表 private List<T> dataList = new ArrayList<>(); // 每读取一行数据触发 @Override public void invoke(T t, AnalysisContext analysisContext) { dataList.add(t); // 数据存入列表 } // 所有数据读取完成后触发 @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { System.out.println("🎉 Excel读取完成,共读取" + dataList.size() + "条数据"); } // 获取读取到的数据列表 public List<T> getDataList() { return dataList; }}通过接口响应实现Excel文件下载,代码简洁直观:
import org.springframework.http.HttpStatus;import org.springframework.http.ResponseEntity;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.net.URLEncoder;import java.util.List;@RestControllerpublic class ExcelController { // Excel下载 @GetMapping("/downloadExcel") public void downloadExcel(HttpServletResponse response) throws IOException { // 设置响应头信息 response.setContentType("application/vnd.ms-excel;charset=UTF-8"); String fileName = URLEncoder.encode("用户", "UTF-8"); // 解决浏览器下载文件名乱码问题 response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); // 写入Excel并响应给前端 FastExcel.write(response.getOutputStream(), User.class) .sheet("用户列表") // Excel工作表名称 .doWrite(buildTestData()); // 写入测试数据 } // 构建测试数据 private List<User> buildTestData() { User user1 = new User(); user1.setId(1); user1.setName("张三"); user1.setAge(26); User user2 = new User(); user2.setId(2); user2.setName("李四"); user2.setAge(22); return List.of(user1, user2); }}接收前端上传的Excel文件,通过监听器读取数据并处理:
// Excel上传接口@PostMapping("/uploadExcel")public ResponseEntity<String> uploadExcel(@RequestParam("file") MultipartFile file) { // 校验文件是否为空 if (file.isEmpty()) { return ResponseEntity.badRequest().body("❌ 请选择要上传的Excel文件!"); } try { // 创建监听器实例 BaseExcelListener<User> excelListener = new BaseExcelListener<>(); // 读取Excel文件 FastExcel.read(file.getInputStream(), User.class, excelListener) .sheet() // 第一个工作表 .doRead(); // 获取读取到的数据 List<User> userList = excelListener.getDataList(); System.out.println("📊 读取到的用户数据:" + userList); return ResponseEntity.ok("✅ Excel文件上传并处理成功!共读取" + userList.size() + "条数据"); } catch (IOException e) { e.printStackTrace(); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body("❌ Excel文件处理失败:" + e.getMessage()); }}整个过程内存占用极低,即使处理10万行数据也无压力💪!
如果你之前的项目使用EasyExcel,想要迁移到FastExcel,只需两步操作,零代码改动!
替换pom.xml中的EasyExcel依赖为FastExcel:
<!-- 移除原EasyExcel依赖 --><!--<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>xxxx</version></dependency>--><!-- 添加FastExcel依赖 --><dependency> <groupId>cn.idev.excel</groupId> <artifactId>fastexcel</artifactId> <version>1.3.0</version></dependency>将代码中EasyExcel的包名替换为FastExcel:
// 替换前// import com.alibaba.excel.**;// 替换后import cn.idev.excel.**;搞定!🎉 所有原有功能完全正常运行,迁移就是这么简单!
FastExcel完美继承了原框架EasyExcel的优点,无论是新项目选型还是老项目迁移,都是首选项:
#Java #Excel #FastExcel #EasyExcel