EasyExcel的基本使用方法


  在Java語言領域,說到Excel處理工具,大家首先想到的可能是阿帕奇的poi,poi在處理數據量不大的excel文件上確實非常強大,但是隨着后來excel從03(一個excel文件中最多有65536行,256列)版升級到07 版(一個excel文件最多1048576行,16384列),poi在處理大數據量的excel時顯得力不從心,03版的excel  poi可以應對,但是對於行數幾乎增加了15倍,列數增加了接近50倍的07版excel,poi很快達到了瓶頸,這是因為poi在處理excel時會將數據全部導入內存再進行數據的加工處理,當數據量過大內存很容易OOM。但是即便如此,poi在處理excel方面還是無人能及,后來在Alibaba的改造和包裝下,EsayExcel應運而生,它首先解決的就是poi的OOM問題,為了解決這個問題,easyExcel對數據載入內存的處理思想相比於poi發生了改變,poi的思路是空間換時間(減少載入內存次數從而節約時間),而easyExcel的思路是時間換空間(運用sax模式一行一行解析,並將一行的解析結果以觀察者的模式通知處理),這樣就很好的解決了OOM問題,EasyExcel還有很多優點,比如容易上手,相比poi來說easyExcel對里面許多方法進行了封裝,運用起來更加快捷方便。

  說excel最重要的操作一定屬上傳和下載了,上傳是什么呢?下載又是什么呢?這些名詞我們聽的很多,但是可能並沒有真正理解,用通俗一點的說法來說就是——上傳指的是將Excel中的數據讀取到數據庫表中並存儲起來,下載指的是將數據庫中的數據導出到Excel文件中,當然,數據倉庫不一定是數據庫,還可以是其它,像redis這種也是可以的。這樣我們就知道數據從哪里出發,終點在哪里了,是不是沒有剛才那么迷茫了呢。接下來就上菜吧,菜名就是easyExcel,語言使用java語言,編譯器是IDEA 2019。

 

1.通過easyExcel讀取xlsx文件中的信息

有如下excel待讀取:

9f4802fd206082c4e17e12d17b25bed0.png  

編碼大體分為兩步,第一步創建文件的屬性PoJo類DemoData(還有book類):

package com.zzb.business.card.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.zzb.business.edison.excel.metadata.BaseRowModel;
import lombok.Data;
@Data
public class DemoData {
@ExcelProperty("編號")
private int no;
@ExcelProperty("朝代")
private String dynasty;
@ExcelProperty("開朝人")
private String king;
}

第二步創建第一步創建的pojo類的listener(還有book對應的listener):

 

package com.zzb.business.card.excel; 
import com.alibaba.excel.context.AnalysisContext;
 import com.alibaba.excel.event.AnalysisEventListener; 
import com.alibaba.fastjson.JSON;import java.util.ArrayList; 
import java.util.List;public class DemoDataListener extends AnalysisEventListener<DemoData> {   
 List<DemoData> list = new ArrayList<DemoData>();  
  /**   
  * 如果使用了spring,請使用這個構造方法。每次創建Listener的時候需要把spring管理的類傳進來    
 */  
  public DemoDataListener() {}  
 /**   
 * 這個每一條數據解析都會來調用   
  * 
  * @param data    
 * @param context    
*/   
@Override  
  public void invoke(DemoData data, AnalysisContext context) {        
System.out.println( JSON.toJSONString(data));
list.add(data); }
/** * 所有數據解析完成了 都會來調用 * * @param context */ @Override public void doAfterAllAnalysed(AnalysisContext context) {
System.out.println(JSON.toJSONString(list)); } }

這樣,大體代碼就已經寫好了,接下來test

@Test
 public void readExcelShouldSuccess(){    
String fileName="src/main/resources/templates/dynasty.xlsx";    
EasyExcel.read(fileName, DemoData.class,new DemoDataListener()).sheet("朝代表").doRead(); EasyExcel.read(fileName, Book.class,new BookDataListener()).sheet("書籍信息").doRead(); } }

如果多個sheet的結構是一樣的,那么可以用doReadAll()方法讀取多個sheet:

EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).doReadAll();  

 文件內容存儲在list中,輸出如下:

a7ba26a6c43cecb2db48cefe39433684.png  

2.通過esayExcel將數據簡單寫入同一個Excel中(class類型不變)

此處的數據使用List來模擬:

//以list模擬數據庫中導出的數據,因為list是excel操作時的橋梁
  List<Book> sheetOne=new ArrayList<>();   
Book book1=new Book();   
 book1.setNo(1);  
  book1.setAuthor("老舍");  
  book1.setBookName("三味書屋"); 
Book book2=new Book();
 book2.setNo(2);
 book2.setBookName("鋼鐵是怎樣煉成的");
 book2.setAuthor("奧斯特洛夫斯基");
 sheetOne.add(book1); 
sheetOne.add(book2);
View Code

接下來寫入一個sheet數據,這種寫法只能寫入一個sheet中的數據,如果再在同一個文件中寫入其它sheet,前邊的所有sheet都會被覆蓋,只保留最后一個sheet的數據

EasyExcel.write(fileName,Book.class).sheet(1,"書籍列表").doWrite(sheetOne);

結果如下:

1803862c772e99af5ccac3dc60fe3479.png  

3.easyExcel寫入多個sheet到同一個文件(sheet類型變動)

@Test  
public void writeComflixbelExcelShouldSuccess(){  
//以list模擬數據庫中導出的數據,因為list是excel操作時的橋梁  
 List<Book> books=new ArrayList<>();  
 List<DemoData> dynastys=new ArrayList<>();      
Book book1=new Book();  book1.setNo(1);      
book1.setAuthor("老舍");     
book1.setBookName("三味書屋");  
Book book2=new Book();     
book2.setNo(2);     
book2.setBookName("鋼鐵是怎樣煉成的");     
book2.setAuthor("奧斯特洛夫斯基");       
 books.add(book1);      
books.add(book2);     
DemoData dynasty=new DemoData();     
dynasty.setNo(1);      
dynasty.setDynasty("宋朝");     
dynasty.setKing("趙匡胤");     
dynastys.add(dynasty);      
String fileName="src/main/resources/templates/book.xlsx";       
ExcelWriter excelWriter=null; 
excelWriter = EasyExcel.write(fileName).build();
//寫入多格式sheet只需要指定文件名,不用指定class類型
 for (int i = 0; i < 5; i++) {         
 if((i&1)==0){               
// 每次都要創建writeSheet 這里注意必須指定sheetNo 而且sheetName必須不一樣。這里注意DemoData.class 可以每次都變,我這里為了方便 所以用的同一個class 實際上可以一直變          
 WriteSheet writeSheet = EasyExcel.writerSheet(i, "朝代" + i).head(DemoData.class).build();              
// 分頁去數據庫查詢數據 這里可以去數據庫查詢每一頁的數據                
excelWriter.write(dynastys, writeSheet);
}else{ WriteSheet writeSheet = EasyExcel.writerSheet(i, "書籍" + i).head(Book.class).build(); // 分頁去數據庫查詢數據 這里可以去數據庫查詢每一頁的數據
excelWriter.write(books, writeSheet);
} } excelWriter.finish(); }

結果如下:

39be2796d19ecb8656493341e8704570.png  
e7a00724933f1886919b234ebc34e0f3.png  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM