欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java EasyExcel讀寫excel如何解決poi讀取大文件內(nèi)存溢出問題

 更新時間:2024年06月17日 10:48:44   作者:編程經(jīng)驗分享  
這篇文章主要介紹了Java EasyExcel讀寫excel如何解決poi讀取大文件內(nèi)存溢出問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

問題

以前項目使用 poi 讀寫 excel,但是 excel 中的數(shù)據(jù)量太大的話,用 poi 讀取時就會導致 OOM 異常,這是因為 poi 在讀取數(shù)據(jù)時,是將全部數(shù)據(jù)一次性都加載到內(nèi)存中。

如何解決

使用EasyExcel,以下是使用示例。

使用示例

pom

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.3</version>
        </dependency>

監(jiān)聽器

public class ProductListener extends AnalysisEventListener<Product> {

    private static final int BATCH_COUNT = 1000;

    private final List<Product> list = new ArrayList<>();

    private int totalCount;

    public ProductListener() {}

    @Override
    public void invoke(Product product, AnalysisContext analysisContext) {
        list.add(product);
        if(list.size() >= BATCH_COUNT){
            saveData();
            list.clear();
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        saveData();
        System.out.printf("數(shù)據(jù)同步完成,總數(shù)量為:%s%n",totalCount);
    }


    public void saveData(){
        if(!list.isEmpty()){
            for (Product product : list) {
                insertIgnore(product);
            }
        }
    }

    public void insertIgnore(Product product) {
        try {
            // 執(zhí)行數(shù)據(jù)庫操作
            System.out.println(product.getName());
            ++totalCount;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

實體類

public class Product {

    private Long id;

    @ExcelProperty("name")
    private String name;

    @ExcelProperty("quantity")
    private Long quantity;

    @ExcelProperty("desc")
    private String desc;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Long getQuantity() {
        return quantity;
    }

    public void setQuantity(Long quantity) {
        this.quantity = quantity;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }
}

讀寫方法

public class MyEasyExcel {

    public static void read(String filePath) {

        try (InputStream inputStream = Files.newInputStream(Paths.get(filePath))) {
            EasyExcel.read(inputStream, Product.class, new ProductListener())
                    .sheet()
                    .doRead();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static void write(List<Product> data, String filePath) {

        try (OutputStream outputStream = Files.newOutputStream(Paths.get(filePath))) {
            ExcelWriterBuilder writerBuilder = EasyExcel.write(outputStream, Product.class);
            writerBuilder.sheet("Data").doWrite(data);
        } catch (Exception e) {
            // 處理異常
        }
    }
}

測試類

class MyEasyExcelTest {

    @Test
    void read() {
        String filePath = "C:\\Users\\XXX\\Desktop\\excel.xlsx";
        MyEasyExcel.read(filePath);
    }

    @Test
    void write() {
        List<Product> products = new ArrayList<>();
        Product product = new Product();
        product.setId(1L);
        product.setName("qwe");
        product.setDesc("abc");
        product.setQuantity(1342L);
        products.add(product);

        String filePath = "C:\\Users\\XXX\\Desktop\\excel.xlsx";

        MyEasyExcel.write(products, filePath);
    }
}

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Spring?Boot如何利用攔截器加緩存完成接口防刷操作

    Spring?Boot如何利用攔截器加緩存完成接口防刷操作

    流的需求出現(xiàn)在許多常見的場景中,下面這篇文章主要給大家介紹了關于Spring?Boot如何利用攔截器加緩存完成接口防刷操作的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-02-02
  • SpringBoot集成Redis—使用RedisRepositories詳解

    SpringBoot集成Redis—使用RedisRepositories詳解

    這篇文章主要介紹了SpringBoot集成Redis—使用RedisRepositories詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java 中文字符按Unicode排序的實現(xiàn)方法

    Java 中文字符按Unicode排序的實現(xiàn)方法

    這篇文章主要介紹了Java 中文字符按Unicode排序的實現(xiàn)方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-10-10
  • JavaFx?Tooltip懸浮提示使用及自定義代碼詳解

    JavaFx?Tooltip懸浮提示使用及自定義代碼詳解

    本篇是基于TornadoFx框架對Tooltip組件進行講解,使用Kotlin語言,和傳統(tǒng)Java使用有所區(qū)別,本章節(jié)包括對tooltip的樣式定制化以及指定窗口顯示,對JavaFx?Tooltip懸浮提示使用及自定義相關知識感興趣的朋友一起看看吧
    2021-12-12
  • Spring boot學習教程之快速入門篇

    Spring boot學習教程之快速入門篇

    這篇文章主要給大家介紹了關于Spring boot的相關資料,本文屬于基礎入門教程,對各位學習Spring boot的新手們具有一定的參考學習價值,,要的朋友們下面來一起看看吧。
    2017-04-04
  • 使用spring aop統(tǒng)一處理異常和打印日志方式

    使用spring aop統(tǒng)一處理異常和打印日志方式

    這篇文章主要介紹了使用spring aop統(tǒng)一處理異常和打印日志方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • SpringBoot整合aop面向切面編程過程解析

    SpringBoot整合aop面向切面編程過程解析

    這篇文章主要介紹了SpringBoot整合aop面向切面編程過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • JDK19新特性使用實例詳解

    JDK19新特性使用實例詳解

    這篇文章主要為大家介紹了JDK19新特性使用實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • spring中的DI步驟詳解

    spring中的DI步驟詳解

    本文主要介紹了bean的裝配實現(xiàn)過程,通常對于簡單數(shù)據(jù)類型數(shù)據(jù)初始主要在獲得對象后,使用setter方法完成,所謂的裝配主要是復雜數(shù)據(jù)類型的依賴注入,感興趣的朋友一起看看吧
    2023-11-11
  • Java多線程饑餓與公平介紹及代碼示例

    Java多線程饑餓與公平介紹及代碼示例

    這篇文章主要介紹了Java多線程饑餓與公平介紹及代碼示例,分析饑餓產(chǎn)生的原因以及相關實例,然后就在java中實現(xiàn)公平性問題做了詳細解析,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11

最新評論