一、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-hant/n/143244.html