如何高效導入百萬級數據?使用easyexcel!

一、什麼是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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-30 16:10
下一篇 2024-12-30 16:10

相關推薦

  • Python利用級數計算圓周率

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

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

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

    編程 2025-04-28
  • Trocket:打造高效可靠的遠程控制工具

    如何使用trocket打造高效可靠的遠程控制工具?本文將從以下幾個方面進行詳細的闡述。 一、安裝和使用trocket trocket是一個基於Python實現的遠程控制工具,使用時…

    編程 2025-04-28
  • Python生成列表最高效的方法

    本文主要介紹在Python中生成列表最高效的方法,涉及到列表生成式、range函數、map函數以及ITertools模塊等多種方法。 一、列表生成式 列表生成式是Python中最常…

    編程 2025-04-28
  • TFN MR56:高效可靠的網路環境管理工具

    本文將從多個方面深入闡述TFN MR56的作用、特點、使用方法以及優點,為讀者全面介紹這一高效可靠的網路環境管理工具。 一、簡介 TFN MR56是一款多功能的網路環境管理工具,可…

    編程 2025-04-27
  • 用Pythonic的方式編寫高效代碼

    Pythonic是一種編程哲學,它強調Python編程風格的簡單、清晰、優雅和明確。Python應該描述為一種語言而不是一種編程語言。Pythonic的編程方式不僅可以使我們在編碼…

    編程 2025-04-27
  • Python生成10萬條數據的高效方法

    本文將從以下幾個方面探討如何高效地生成Python中的10萬條數據: 一、使用Python內置函數生成數據 Python提供了許多內置函數可以用來生成數據,例如range()函數可…

    編程 2025-04-27
  • Gino FastAPI實現高效低耗ORM

    本文將從以下多個方面詳細闡述Gino FastAPI的優點與使用,展現其實現高效低耗ORM的能力。 一、快速入門 首先,我們需要在項目中安裝Gino FastAPI: pip in…

    編程 2025-04-27
  • 如何利用位元組跳動推廣渠道高效推廣產品

    對於企業或者個人而言,推廣產品或者服務是必須的。如何讓更多的人知道、認識、使用你的產品是推廣的核心問題。而今天,我們要為大家介紹的是如何利用位元組跳動推廣渠道高效推廣產品。 一、個性…

    編程 2025-04-27
  • 如何製作高效的目標識別數據集

    對於機器學習中的目標識別任務來說,製作高質量的數據集對於訓練模型十分重要。本文將從數據收集、數據標註、數據增強等方面闡述如何製作高效的目標識別數據集。 一、數據收集 在製作目標識別…

    編程 2025-04-27

發表回復

登錄後才能評論