簡介
FastExcel是由原EasyExcel作者在阿里巴巴宣布停止維護EasyExcel之后推出的升級版框架。它繼承了EasyExcel的所有優點,并且在性能和功能上進行了顯著的提升和創新。
FastExcel的特點
- 高性能讀寫: FastExcel專注于性能優化,能夠高效處理大規模的Excel數據,顯著降低內存占用。
- 簡單易用: 提供了簡潔直觀的API,使得開發者可以輕松集成到項目中,無論是簡單的Excel操作還是復雜的數據處理都能快速上手。
- 流式操作: 支持流式讀取,將一次性加載大量數據的問題降到最低,特別適合處理數十萬甚至上百萬行的數據。
- 完全兼容: 完全兼容原EasyExcel的所有功能和特性,用戶可以無縫過渡。
- 持續更新: FastExcel會持續更新,修復bug,優化性能,增加新功能。
FastExcel使用方法詳解
創建實體類和監聽器
在使用FastExcel進行Excel文件的讀寫操作之前,需要定義一個實體類,該類中的每個屬性對應Excel中的一列。使用@ExcelProperty
注解來指定列名。
import cn.idev.excel.annotation.ExcelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Setter
@Getter
@ToString
public class User {
@ExcelProperty("編號")
private Integer id;
@ExcelProperty("名字")
private String name;
@ExcelProperty("年齡")
private Integer age;
}
FastExcel通過事件監聽器實現Excel文件的逐行讀取,這對于處理大文件尤為重要,因為它可以避免內存溢出的問題。下面是一個事件監聽器的示例,它在讀取每行數據時將數據添加到列表中,并在所有數據讀取完成后執行一些操作。
import cn.idev.excel.context.AnalysisContext;
import cn.idev.excel.event.AnalysisEventListener;
import java.util.ArrayList;
import java.util.List;
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("讀取完成,共讀取了 " + dataList.size() + " 條數據");
}
public List<T> getDataList() {
return dataList;
}
}
實現寫入和讀取功能
以下是使用FastExcel進行Excel寫入的示例代碼。首先,創建測試數據,然后通過FastExcel.write
方法將數據寫入到Excel文件中。
// Excel寫入功能
@GetMapping("/download")
public void download(HttpServletResponse response) throws IOException {
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode("test", "UTF-8");
response.setHeader("Content-disposition",
"attachment;filename*=utf-8''" + fileName + ".xlsx");
// 寫入數據
FastExcel.write(response.getOutputStream(), User.class)
.sheet("模板")
.doWrite(buildData());
}
// 創建測試數據
private List<User> buildData() {
User user1 = new User();
user1.setId(1);
user1.setName("張三");
user1.setAge(18);
User user2 = new User();
user2.setId(2);
user2.setName("李四");
user2.setAge(19);
return List.of(user1, user2);
}
以下是使用FastExcel進行Excel讀取的示例代碼。通過FastExcel.read
方法讀取Excel文件,并使用之前創建的監聽器來處理讀取到的數據。
// Excel讀取功能
@PostMapping("/upload")
public ResponseEntity<String> upload(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return ResponseEntity.badRequest().body("請選擇一個文件上傳!");
}
try {
BaseExcelListener<User> baseExcelListener = new BaseExcelListener<>();
FastExcel.read(file.getInputStream(), User.class, baseExcelListener).sheet().doRead();
List<User> dataList = baseExcelListener.getDataList();
System.out.println(dataList);
return ResponseEntity.ok("文件上傳并處理成功!");
} catch (IOException e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("文件處理失敗!");
}
}
Excel轉換為PDF
FastExcel還支持將Excel文件轉換為PDF文件,這一功能底層依賴于Apache POI和itext-pdf。請注意,使用itext-pdf時需要確保符合其許可證要求。
FastExcel.convertToPdf(new File("excelFile"),new File("pdfFile"),null,null);
小結
FastExcel作為一個高效且易于使用的Excel處理工具,不僅繼承了EasyExcel的所有優點,還在此基礎上進行了性能和功能的增強。
通過上述示例,我們可以看到FastExcel如何簡化Excel文件的讀寫操作,以及如何通過事件監聽器實現流式處理,從而有效管理內存使用。無論是企業數據導入導出還是個人項目開發,FastExcel都能提供強大的支持。
FastExcel與EasyExcel的區別
- 性能提升: FastExcel在性能上比EasyExcel更好,更穩定。
- API一致性: FastExcel與EasyExcel的API完全一致,可以無縫切換。
- 功能增加: FastExcel 1.0.0版本新增了讀取Excel指定行數和將Excel轉換為PDF的功能。
結論
FastExcel作為一個輕量級但功能強大的Java庫,專為需要高性能和低內存占用的Excel文件處理而設計。如果您的項目需要處理大規模的Excel數據,FastExcel無疑是一個值得考慮的選擇。其流式處理和靈活的API使其成為處理Excel文件的理想工具。
來源:juejin.cn/post/7451871895753326626
閱讀原文:原文鏈接
該文章在 2025/1/18 11:09:48 編輯過