一、什麼是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
微信掃一掃
支付寶掃一掃