文章目錄
- EasyExcel使用詳解
- 一、引言
- 二、環境準備與基礎配置
- 1、添加依賴
- 2、定義實體類
- 三、Excel 讀取詳解
- 1、基礎讀取
- 2、自定義監聽器
- 3、多 Sheet 處理
- 四、Excel 寫入詳解
- 1、基礎寫入
- 2、動態列與復雜表頭
- 3、樣式與模板填充
- 五、總結
EasyExcel使用詳解
一、引言
EasyExcel 是阿里巴巴開源的一款基于 Java 的 Excel 處理工具,專注于高性能和低內存占用,尤其適合處理百萬級數據的大文件。相比傳統的 Apache POI,EasyExcel 通過流式讀寫和智能內存管理,顯著降低了內存溢出風險,同時提供了簡潔的 API 和靈活的注解配置。本文將從基礎配置到實際應用場景,詳解 EasyExcel 的核心功能。
二、環境準備與基礎配置
1、添加依賴
在 pom.xml
中引入 EasyExcel 依賴(以最新穩定版為例):
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.2.0</version>
</dependency>
2、定義實體類
通過注解 @ExcelProperty
映射 Excel 列名或索引,@ExcelIgnore
忽略字段:
@Data
public class User {@ExcelProperty("用戶ID")private Long id;@ExcelProperty(value = "姓名", index = 1) // 指定列索引private String name;@ExcelProperty("創建時間")private Date createTime;@ExcelIgnore // 不參與讀寫private String remark;
}
三、Excel 讀取詳解
1、基礎讀取
使用 PageReadListener
實現分批處理(默認每 100 條處理一次):
String fileName = "user_data.xlsx";
EasyExcel.read(fileName, User.class, new PageReadListener<User>(dataList -> {dataList.forEach(user -> System.out.println("讀取數據:" + user.getName()));
})).sheet().doRead();
2、自定義監聽器
實現 ReadListener
接口,手動控制數據批次:
@Slf4j
public class UserListener implements ReadListener<User> {private static final int BATCH_SIZE = 200;private List<User> cachedList = new ArrayList<>(BATCH_SIZE);@Overridepublic void invoke(User user, AnalysisContext context) {cachedList.add(user);if (cachedList.size() >= BATCH_SIZE) {saveToDatabase(cachedList); // 模擬入庫操作cachedList.clear();}}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {if (!cachedList.isEmpty()) saveToDatabase(cachedList);log.info("所有數據解析完成!");}private void saveToDatabase(List<User> list) {// 實際業務中調用 DAO 層}
}
調用方式:
EasyExcel.read(fileName, User.class, new UserListener()).sheet().doRead();
3、多 Sheet 處理
支持讀取多個 Sheet,每個 Sheet 可綁定不同監聽器:
try (ExcelReader excelReader = EasyExcel.read(fileName).build()) {ReadSheet sheet1 = EasyExcel.readSheet(0).head(User.class).registerReadListener(new UserListener()).build();ReadSheet sheet2 = EasyExcel.readSheet(1).head(Order.class).registerReadListener(new OrderListener()).build();excelReader.read(sheet1, sheet2);
}
四、Excel 寫入詳解
1、基礎寫入
直接寫入數據列表,自動生成表頭:
List<User> userList = queryUsersFromDB(); // 從數據庫查詢數據
EasyExcel.write("export_users.xlsx", User.class).sheet("用戶列表").doWrite(userList);
2、動態列與復雜表頭
通過 @ExcelProperty
定義多級表頭和列順序:
@Data
public class SaleData {@ExcelProperty({"銷售信息", "訂單號"})private String orderId;@ExcelProperty({"銷售信息", "金額"})private BigDecimal amount;@ExcelProperty(value = "時間", index = 2) // 指定列順序private Date createTime;
}
3、樣式與模板填充
支持基于模板的填充(如財務報表):
// 填充模板中的占位符(如 {name})
Map<String, Object> data = new HashMap<>();
data.put("name", "張三");
data.put("amount", 10000);EasyExcel.write("report.xlsx").withTemplate("template.xlsx").sheet().doFill(data);
五、總結
EasyExcel 憑借其高性能和低內存占用,成為處理大文件 Excel 的首選工具。通過靈活的注解配置和事件監聽機制,開發者可以輕松實現復雜的數據映射和分批處理邏輯。無論是數據導入導出,還是模板化報表生成,EasyExcel 均能高效完成。
版權聲明:本博客內容為原創,轉載請保留原文鏈接及作者信息。
參考文章:
- EasyExcel官方文檔
- CSDN:EasyExcel詳解(結合官方文檔)