一、easyexcel導出百萬級數據思路
當需要將大量數據導出到Excel中時,使用easyexcel會非常便捷,它可以輕鬆地處理大批量數據,並提供了多種導出方式,例如導出到本地、輸出到瀏覽器等。easyexcel的導出思路可以分為以下幾個步驟:
1、使用EasyExcel對象創建一個輸出流,通常使用response.getOutputStream()。
2、調用EasyExcel的write()方法依次寫入需要導出到Excel的每一行數據。在處理百萬級數據時,需要結合分頁查詢的方式,分批寫入避免內存溢出。
3、將EasyExcel對象的finish()方法執行,將數據刷到Excel文件中。
4、將輸出流關閉,結束導出操作。
以下是代碼示例:
public void exportData(HttpServletResponse response) throws IOException {
// 獲取數據
List dataList = getDataList();
// 設置文件名
String fileName = "導出數據.xlsx";
// 設置響應頭
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
// 創建輸出流
ServletOutputStream outputStream = response.getOutputStream();
// 創建excel對象
EasyExcel.write(outputStream, DataDTO.class).sheet("數據").doWrite(dataList);
// 關閉輸出流
outputStream.flush();
outputStream.close();
}
二、easyexcel導入大量數據
除了導出功能外,easyexcel還提供了大量數據導入的功能。與導出不同的是,easyexcel導入數據操作需要實現監聽器(EasyExcelReadListener),而導出則不需要監聽器。
導入大量數據時,需要分批讀取Excel文件中的數據。讀取Excel文件時,需要用到EasyExcel對象的read()方法,該方法中涉及到的listener參數就是實現了EasyExcelReadListener介面的監聽器對象,可以在其中處理每個讀取到的數據行。同時,還可以在監聽器中處理Excel文件的讀取進度及相關的異常情況,保證讀取操作的順利進行。
以下是代碼示例:
public void importData(MultipartFile file) throws IOException {
// 創建讀取excel的輸入流
InputStream inputStream = file.getInputStream();
// 創建監聽器
EasyExcel.read(inputStream, DataDTO.class, new DataListener()).sheet().doRead();
// 關閉輸入流
inputStream.close();
}
public class DataListener extends AnalysisEventListener {
// 每次讀取3000條數據,然後存入資料庫
private static final int BATCH_COUNT = 3000;
List dataList = new ArrayList();
private DataService dataService = new DataService();
@Override
public void invoke(DataDTO dataDTO, AnalysisContext analysisContext) {
dataList.add(dataDTO);
if (dataList.size() >= BATCH_COUNT) {
saveDataList();
dataList.clear();
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
saveDataList();
}
private void saveDataList() {
dataService.saveDataList(dataList);
}
}
三、easyexcel導入百萬級數據
當需要導入百萬級數據時,需要特別注意導入操作的性能與穩定性。由於easyexcel僅使用內存來讀取Excel文件,處理大量數據時會出現內存溢出的問題。因此,需要使用分批讀取的方式,每次將一部分數據讀取到內存中進行處理,避免一次性讀入全部數據導致內存溢出。
以下是分批讀取Excel文件並讀取數據的代碼示例:
public void importData(MultipartFile file) throws IOException {
// 創建讀取excel的輸入流
InputStream inputStream = file.getInputStream();
// 創建workbook對象
Workbook workbook = WorkbookFactory.create(inputStream);
// 獲取sheet總數
int sheetCount = workbook.getNumberOfSheets();
// 設置分頁大小
int pageSize = 3000;
// 循環讀取每一個sheet
for (int i = 0; i < sheetCount; i++) {
// 獲取當前sheet
Sheet sheet = workbook.getSheetAt(i);
// 獲取總行數
int rowCount = sheet.getPhysicalNumberOfRows();
// 遍歷行,從第3行開始讀取數據
for (int j = 2; j < rowCount; j++) {
// 創建一行數據對象
DataDTO dataDTO = new DataDTO();
// 獲取當前行的單元格
Row row = sheet.getRow(j);
// 讀取單元格數據
dataDTO.setName(row.getCell(0, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getStringCellValue());
dataDTO.setAge((int) row.getCell(1, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getNumericCellValue());
dataDTO.setSex(row.getCell(2, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getStringCellValue());
// 將數據保存到資料庫
dataService.saveData(dataDTO);
}
}
// 關閉輸入流與workbook對象
inputStream.close();
workbook.close();
}
四、easyexcel分批寫入
在處理百萬級數據時,為了防止一次性將全部數據寫入Excel文件,導致內存溢出,需要使用分批寫入的方式。EasyExcel提供了write()方法的重載方法,支持傳入多個list集合,將多個集合中的數據依次寫入到一個sheet中,避免一次性寫入過多數據。
以下是分批寫入Excel文件的代碼示例:
public void exportData(HttpServletResponse response) throws IOException {
// 總數據量
int totalSize = dataService.getDataCount();
// 分頁大小
int pageSize = 3000;
// 總頁碼
int totalPage = (totalSize + pageSize - 1) / pageSize;
// 設置文件名
String fileName = "導出數據.xlsx";
// 設置響應頭
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
// 創建輸出流
ServletOutputStream outputStream = response.getOutputStream();
// 創建excel對象
ExcelWriter excelWriter = EasyExcel.write(outputStream).build();
// 分批寫入數據
for (int i = 1; i totalSize) {
endIndex = totalSize;
}
// 獲取數據
List dataList = dataService.getDataList(startIndex, endIndex);
// 創建Sheet對象
WriteSheet writeSheet = EasyExcel.writerSheet("數據"+i).build();
excelWriter.write(dataList, writeSheet);
}
// 關閉excelWriter對象
excelWriter.finish();
// 關閉輸出流
outputStream.flush();
outputStream.close();
}
原創文章,作者:XMAJ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/143244.html
微信掃一掃
支付寶掃一掃