一、什麼是easyexcel?
EasyExcel是一個操作Excel的Java工具,主要用於讀寫大量數據時提高效率。它採用了基於流的操作方式,大大減少了內存消耗以及GC的次數。而且EasyExcel還有一些方便實用的功能,比如導出模板、數據校驗等等。
二、為什麼選擇easyexcel?
在處理大量Excel數據時,傳統的POI操作方式會出現諸多問題。因為POI需要一次性將整個Excel文件讀入內存,如果excel文件過大,就會出現內存溢出導致程序崩潰。而easyexcel則通過內部自定義的回調方式,可以避免過多存儲Excel數據而佔用過多的內存。
而且EasyExcel還支持多種格式的數據導入和導出,包括Excel、Csv、Pdf和Html等等。這些功能都使得easyexcel成為處理Excel數據的首選工具。
三、如何使用easyexcel導入百萬級數據?
我們來看一個簡單的示例:
public void readExcel(){ InputStream inputStream = null; try { inputStream = new FileInputStream("test.xlsx"); // 構建讀取實體類 ExcelListener listener = new ExcelListener(); ExcelReader excelReader = new ExcelReader(inputStream, null, listener); excelReader.read(); List<Object> list = listener.getList(); // TODO: 對數據進行處理 } catch (FileNotFoundException e) { e.printStackTrace(); } finally { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } }
上述代碼中,我們通過創建一個ExcelReader對象,然後傳入Excel數據流、讀取sheet的索引以及自定義的ExcelListener類實例。然後調用read()方法就可以讀取到Excel文件中的所有數據。
但是實際上,我們一般不會將所有數據都讀取到內存中,因為這樣會佔用大量內存並且運行緩慢。而是將數據分批讀取,每次讀取一定量的數據到內存中進行處理,然後再讀取下一批數據。這樣可以使得程序處理速度更快而且更加穩定。
下面是一個使用easyexcel分批讀取百萬級數據的示例代碼:
public void batchReadExcel() { InputStream inputStream = null; try { inputStream = new FileInputStream("test.xlsx"); ExcelListener listener = new ExcelListener(); // 批量處理數據每次讀取1000條數據 AnalysisEventListener<Object> batchListener = new AnalysisEventListener<Object>() { private static final int BATCH_COUNT = 1000; // 自定義數據處理邏輯, 每讀取1000條數據進行一次處理 List<Object> list = new ArrayList<Object>(BATCH_COUNT); public void invoke(Object object, AnalysisContext context) { list.add(object); if (list.size() >= BATCH_COUNT) { // TODO: 對數據進行處理 list.clear(); } } public void doAfterAllAnalysed(AnalysisContext context) { // TODO: 處理最後一次的數據 } }; ExcelReaderBuilder excelReaderBuilder = new ExcelReaderBuilder(); ExcelReader excelReader = excelReaderBuilder .file(inputStream) .readAll() .headRowNumber(1) .excelType(ExcelTypeEnum.XLSX) .registerReadListener(batchListener) .build(); excelReader.read(); } catch (FileNotFoundException e) { // TODO: 異常處理 } finally { try { inputStream.close(); } catch (IOException e) { // TODO: 異常處理 } } }
在上述代碼中,我們首先創建了一個批量處理的監聽器,每次處理一定量的數據。然後通過ExcelReaderBuilder來創建ExcelReader實例,將輸入流、讀取所有sheet、指定Excel類型、批量處理監聽器傳入ExcelReaderBuilder中,最後調用build()方法創建ExcelReader實例,並調用read()方法進行讀取。
四、如何實現數據校驗?
EasyExcel內置了一些常用的數據校驗功能。對於一些特殊的校驗需求,可以通過繼承EasyExcel內置的ConstraintValidator實現自定義校驗規則。
下面是一個實現數據校驗的示例代碼:
public class ExcelListener extends AnalysisEventListener<Object> { private List<Object> list = new ArrayList<Object>(); // 繼承ConstraintValidator並實現自定義校驗規則 private ConstraintValidator constraintValidator; public ExcelListener(ConstraintValidator constraintValidator) { this.constraintValidator = constraintValidator; } @Override public void invoke(Object object, AnalysisContext context) { if(constraintValidator != null) { // 在讀取Excel文件之前,對數據進行校驗 constraintValidator.validate(object); } list.add(object); } // 省略getter、setter方法 }
上述代碼中,我們通過繼承EasyExcel的AnalysisEventListener實現對Excel數據的監聽。在invoke()方法中,我們可以將讀取到的數據進行校驗,然後將校驗通過後的數據加入到列表中。
下面是一個自定義校驗規則的示例代碼:
public class CustomConstraintValidator implements ConstraintValidator { @Override public void validate(Object o) throws Exception { // TODO: 自定義校驗邏輯 } @Override public void addCondition(Condition condition) { } @Override public void init() { } @Override public void setParameters(Map<String, Object> map) { } @Override public void close() throws IOException { } }
五、如何導出Excel數據到文件?
EasyExcel同樣支持從Java對象中導出數據到Excel文件中,操作非常簡單,只需要調用EasyExcel的write()方法,並傳入數據和文件保存路徑即可。
下面是一個導出Excel的示例代碼:
public void writeExcel() { OutputStream outputStream = null; try { outputStream = new FileOutputStream("test.xlsx"); // 準備導出數據 List<Object> list = new ArrayList<Object>(); // TODO: 添加數據到列表中 // 導出Excel文件 ExcelWriter excelWriter = EasyExcel.write(outputStream).build(); WriteSheet writeSheet = EasyExcel.writerSheet(0, "Sheet1").head(Object.class).build(); excelWriter.write(list, writeSheet); } catch (IOException e) { // TODO: 異常處理 } finally { try { outputStream.close(); } catch (IOException e) { // TODO: 異常處理 } } }
上述代碼中,我們首先創建一個輸出流,然後準備要導出的數據,並創建ExcelWriter實例。調用EasyExcel的靜態方法write(),並傳入輸出流即可實現創建ExcelWriter實例的功能。然後通過調用EasyExcel的writerSheet()方法來創建WriteSheet實例,並指定sheet的名稱和要導出的數據類型,然後將數據和WriteSheet傳入ExcelWriter的write()方法即可實現Excel數據的導出。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/301927.html