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);
}
}總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實現(xiàn)百萬數(shù)據(jù)導出Excel的詳細指南
這篇文章主要為大家詳細介紹了使用Java語言實現(xiàn)百萬數(shù)據(jù)導出Excel的詳細方法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2025-07-07
IntelliJ?IDEA中初始化Java類的常用快捷方法詳解
這篇文章主要為大家詳細介紹了IntelliJ?IDEA中初始化Java類并設(shè)置所有屬性的常用快捷方法,文中的示例代碼講解詳細,需要的小伙伴可以參考下2026-02-02
基于Ant路徑匹配規(guī)則AntPathMatcher的注意事項
這篇文章主要介紹了基于Ant路徑匹配規(guī)則AntPathMatcher的注意事項,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
IDEA創(chuàng)建的maven項目中pom.xml增加新依賴無效問題及解決
在IDEA中,解決maven項目pom.xml增加依賴但外部庫未更新的問題,可以通過設(shè)置"構(gòu)建腳本更改后同步項目"選項為"任何更改",然后刷新Maven項目來解決2025-01-01
Netty分布式ByteBuf使用SocketChannel讀取數(shù)據(jù)過程剖析
這篇文章主要為大家介紹了Netty源碼分析ByteBuf使用SocketChannel讀取數(shù)據(jù)過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-03-03
Spring中@ConfigurationProperties的用法解析
這篇文章主要介紹了Spring中@ConfigurationProperties的用法解析,傳統(tǒng)的Spring一般都是基本xml配置的,后來spring3.0新增了許多java config的注解,特別是spring boot,基本都是清一色的java config,需要的朋友可以參考下2023-11-11

