青海西寧制作網(wǎng)站企業(yè)/鎮(zhèn)江網(wǎng)站建設(shè)制作公司
簡(jiǎn)介
FastExcel是由原EasyExcel作者在阿里巴巴宣布停止維護(hù)EasyExcel之后推出的升級(jí)版框架。它繼承了EasyExcel的所有優(yōu)點(diǎn),并且在性能和功能上進(jìn)行了顯著的提升和創(chuàng)新。
FastExcel的特點(diǎn)
- 高性能讀寫:FastExcel專注于性能優(yōu)化,能夠高效處理大規(guī)模的Excel數(shù)據(jù),顯著降低內(nèi)存占用。
- 簡(jiǎn)單易用:提供了簡(jiǎn)潔直觀的API,使得開發(fā)者可以輕松集成到項(xiàng)目中,無(wú)論是簡(jiǎn)單的Excel操作還是復(fù)雜的數(shù)據(jù)處理都能快速上手。
- 流式操作:支持流式讀取,將一次性加載大量數(shù)據(jù)的問(wèn)題降到最低,特別適合處理數(shù)十萬(wàn)甚至上百萬(wàn)行的數(shù)據(jù)。
- 完全兼容:完全兼容原EasyExcel的所有功能和特性,用戶可以無(wú)縫過(guò)渡。
- 持續(xù)更新:FastExcel會(huì)持續(xù)更新,修復(fù)bug,優(yōu)化性能,增加新功能。
FastExcel使用方法詳解
創(chuàng)建實(shí)體類和監(jiān)聽器
創(chuàng)建實(shí)體類
在使用FastExcel進(jìn)行Excel文件的讀寫操作之前,需要定義一個(gè)實(shí)體類,該類中的每個(gè)屬性對(duì)應(yīng)Excel中的一列。使用@ExcelProperty
注解來(lái)指定列名。
/*** @author 作者:TesterRoad* @time 創(chuàng)建時(shí)間:2024* @desc 公眾號(hào):測(cè)試工程師成長(zhǎng)之路*/import cn.idev.excel.annotation.ExcelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;@Setter
@Getter
@ToString
public class User {@ExcelProperty("編號(hào)")private Integer id;@ExcelProperty("名字")private String name;@ExcelProperty("年齡")private Integer age;
}
創(chuàng)建事件監(jiān)聽器
FastExcel通過(guò)事件監(jiān)聽器實(shí)現(xiàn)Excel文件的逐行讀取,這對(duì)于處理大文件尤為重要,因?yàn)樗梢员苊鈨?nèi)存溢出的問(wèn)題。下面是一個(gè)事件監(jiān)聽器的示例,它在讀取每行數(shù)據(jù)時(shí)將數(shù)據(jù)添加到列表中,并在所有數(shù)據(jù)讀取完成后執(zhí)行一些操作。
/*** @author 作者:TesterRoad* @time 創(chuàng)建時(shí)間:2024* @desc 公眾號(hào):測(cè)試工程師成長(zhǎng)之路*/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<>();@Overridepublic void invoke(T t, AnalysisContext analysisContext) {dataList.add(t);}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {System.out.println("讀取完成,共讀取了 " + dataList.size() + " 條數(shù)據(jù)");}public List<T> getDataList() {return dataList;}
}
實(shí)現(xiàn)寫入和讀取功能
Excel寫入功能
以下是使用FastExcel進(jìn)行Excel寫入的示例代碼。首先,創(chuàng)建測(cè)試數(shù)據(jù),然后通過(guò)FastExcel.write
方法將數(shù)據(jù)寫入到Excel文件中。
/*** @author 作者:TesterRoad* @time 創(chuàng)建時(shí)間:2024* @desc 公眾號(hào):測(cè)試工程師成長(zhǎng)之路*/// 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");// 寫入數(shù)據(jù)FastExcel.write(response.getOutputStream(), User.class).sheet("模板").doWrite(buildData());
}// 創(chuàng)建測(cè)試數(shù)據(jù)
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);
}
Excel讀取功能
以下是使用FastExcel進(jìn)行Excel讀取的示例代碼。通過(guò)FastExcel.read
方法讀取Excel文件,并使用之前創(chuàng)建的監(jiān)聽器來(lái)處理讀取到的數(shù)據(jù)。
/*** @author 作者:TesterRoad* @time 創(chuàng)建時(shí)間:2024* @desc 公眾號(hào):測(cè)試工程師成長(zhǎng)之路*/// Excel讀取功能
@PostMapping("/upload")
public ResponseEntity<String> upload(@RequestParam("file") MultipartFile file) {if (file.isEmpty()) {return ResponseEntity.badRequest().body("請(qǐng)選擇一個(gè)文件上傳!");}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轉(zhuǎn)換為PDF
FastExcel還支持將Excel文件轉(zhuǎn)換為PDF文件,這一功能底層依賴于Apache POI和itext-pdf。請(qǐng)注意,使用itext-pdf時(shí)需要確保符合其許可證要求。
FastExcel.convertToPdf(new File("excelFile"),new File("pdfFile"),null,null);
小結(jié)
FastExcel作為一個(gè)高效且易于使用的Excel處理工具,不僅繼承了EasyExcel的所有優(yōu)點(diǎn),還在此基礎(chǔ)上進(jìn)行了性能和功能的增強(qiáng)。通過(guò)上述示例,我們可以看到FastExcel如何簡(jiǎn)化Excel文件的讀寫操作,以及如何通過(guò)事件監(jiān)聽器實(shí)現(xiàn)流式處理,從而有效管理內(nèi)存使用。無(wú)論是企業(yè)數(shù)據(jù)導(dǎo)入導(dǎo)出還是個(gè)人項(xiàng)目開發(fā),FastExcel都能提供強(qiáng)大的支持。
FastExcel與EasyExcel的區(qū)別
- 性能提升:FastExcel在性能上比EasyExcel更好,更穩(wěn)定。
- API一致性:FastExcel與EasyExcel的API完全一致,可以無(wú)縫切換。
- 功能增加:FastExcel 1.0.0版本新增了讀取Excel指定行數(shù)和將Excel轉(zhuǎn)換為PDF的功能。
結(jié)論
FastExcel作為一個(gè)輕量級(jí)但功能強(qiáng)大的Java庫(kù),專為需要高性能和低內(nèi)存占用的Excel文件處理而設(shè)計(jì)。如果您的項(xiàng)目需要處理大規(guī)模的Excel數(shù)據(jù),FastExcel無(wú)疑是一個(gè)值得考慮的選擇。其流式處理和靈活的API使其成為處理Excel文件的理想工具。
來(lái)源:https://juejin.cn/post/7451871895753326626