easyexcel導出百萬級數據

一、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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
XMAJ的頭像XMAJ
上一篇 2024-10-14 18:47
下一篇 2024-10-14 18:47

相關推薦

  • Python利用級數計算圓周率

    本文將詳細介紹Python利用級數計算圓周率的方法,旨在幫助Python開發者更好地理解級數原理。 一、Leibniz公式計算圓周率 Leibniz公式是一種基於級數的求圓周率的方…

    編程 2025-04-28
  • Python萊布尼茲級數

    Python萊布尼茲級數是一種在計算機領域中使用的數學演算法,可以在Python中準確地計算圓周率的值。本文將從多個方面對這一演算法進行詳細講解,希望能夠幫助讀者更好地理解和應用這一算…

    編程 2025-04-28
  • EasyExcel Pom – Java操作Excel工具

    一、簡介 EasyExcel是基於Java的Excel操作工具,可以將POJO、XML和Map相互轉換,也可以通過流的方式讀取和寫入Excel文件。該工具適用於任何大小的Excel…

    編程 2025-04-25
  • 使用easyexcel設置單元格顏色的方法

    一、設置整個單元格的背景顏色 EasyExcel是一個開源的基於Java的Excel讀寫解決方案,我們可以通過它的API來設置Excel的單元格的樣式。要設置整個單元格的背景顏色,…

    編程 2025-04-24
  • EasyExcel導入返回錯誤信息詳解

    一、EasyExcel導入返回錯誤信息 在使用EasyExcel進行Excel文件導入時,很可能會遇到一些錯誤,這時候就需要返回錯誤信息幫助用戶識別錯誤原因。EasyExcel提供…

    編程 2025-02-25
  • EasyExcel 導出全面解析

    一、EasyExcel 簡介 EasyExcel 是一個開源的跨平台 Java 處理 Excel 的第三方庫,它採用了註解方式設置 Excel 表格的屬性,可以輕鬆實現 Excel…

    編程 2025-02-25
  • EasyExcel設置行高的詳細闡述

    一、使用默認行高 在EasyExcel中,如果我們不設置特定的行高,程序會使用默認行高,如果內容超出單元格寬度,會自動換行。使用默認行高時,程序會自動調整行高,以適應內容的大小。 …

    編程 2025-02-24
  • 使用EasyExcel設置單元格顏色

    一、背景介紹 EasyExcel是基於Apache POI封裝的Excel操作工具,可以方便地讀寫Excel文件。在Excel文件操作的過程中,經常需要設置單元格的樣式,其中一個重…

    編程 2025-02-05
  • EasyExcel導出Excel詳解

    一、EasyExcel簡介 EasyExcel是一個基於Java的開源工具,幾乎不需要學習就可以編寫Excel,生成Excel文件並讀取Excel文件。該工具可以幫助用戶輕鬆處理E…

    編程 2025-01-27
  • easyexcel導入指南

    一、easyexcel導入數據 easyexcel是一種開源的Java解析和生成Excel的庫。使用easyexcel導入數據十分方便快捷,只需要按照以下步驟進行即可: 1、在項目…

    編程 2025-01-06

發表回復

登錄後才能評論