1.概念理解
EasyExcel是阿里巴巴提供的一個針對excel的一個簡單高效的框架,它可以用最簡潔的代碼,最高效地實現對excel的讀和寫操作。
2、EasyExcel特點
- Java領域解析、生成Excel比較有名的框架有Apache poi、jxl等。但他們都存在一個嚴重的問題就是非常的耗內存。如果你的系統並發量不大的話可能還行,但是一旦並發上來后一定會OOM或者JVM頻繁的full gc。
- EasyExcel是阿里巴巴開源的一個excel處理框架,以使用簡單、節省內存著稱。EasyExcel能大大減少占用內存的主要原因是在解析Excel時沒有將文件數據一次性全部加載到內存中,而是從磁盤上一行行讀取數據,逐個解析。
- EasyExcel采用一行一行的解析模式,並將一行的解析結果以觀察者的模式通知處理(AnalysisEventListener)。
3.使用EasyExcel需要引入的依賴
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.1</version>
</dependency>
在IDEA中安裝lombok插件,並引入依賴,Lombok能以簡單的注解形式來簡化java代碼,提高開發人員的開發效率。
- 在該演示中,我只用到了@Data這個注解,它幫我們自動生成了屬性的getter、setter方法
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
<scope>provided</scope>
</dependency>
4.使用EasyExcel進行寫操作
第一步:創建實體類,和excel中數據對應
@Data
public class DemoData {
//設置excel表頭名稱和屬性
@ExcelProperty("學生編號")
private Integer sno;
@ExcelProperty("學生姓名")
private String sname;
}
第二步:測試
public class TestEasyExcel {
public static void main(String[] args) {
/*實現excel寫操作*/
//1.設置寫入文件夾地址和excel文件名稱
String filename = "E:\\student.xlsx"; //要寫入的文件位置
//2.調用easyexcel里面的方法實現寫操作
//write方法兩個參數:第一個參數為文件路徑名稱,第二個參數實體類class
EasyExcel.write(filename, DemoData.class).sheet("學生列表").doWrite(getData());
}
//將創建的多個對象添加到列表中
private static List<DemoData> getData(){
List<DemoData> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
DemoData data = new DemoData();
data.setSno(i);
data.setSname("至尊寶" + i);
list.add(data);
}
return list;
}
}
第三步:查看結果
5.使用EasyExcel進行讀操作
讀操作與寫操作稍有不同,需創建一個監聽類,下面將上面寫出的文件E:\student.xlsx進行讀取。
第一步:創建和excel對應的實體類,標記對應的列關系
@Data
public class DemoData {
//設置excel表頭名稱,設置列的索引,從0開始
@ExcelProperty(value = "學生編號",index = 0)
private Integer sno;
@ExcelProperty(value = "學生姓名",index = 1)
private String sname;
}
第二步:創建監聽進行excel文件讀取【核心】
- 讀取一行,解析一行
- 需繼承AnalysisEventListener類
public class ExcelListener extends AnalysisEventListener<DemoData> {
//一行一行讀取excel內容,從第二行(除表頭)開始讀
@Override
public void invoke(DemoData data, AnalysisContext analysisContext) {
System.out.println("每一行" + data);
}
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
System.out.println("表頭:" + headMap);
}
//讀取完之后執行
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
}
第三步:測試
public class TestEasyExcelRead {
public static void main(String[] args) {
//實現excel讀操作
String s = "E:\\student.xlsx";
EasyExcel.read(s,DemoData.class,new ExcelListener()).sheet().doRead();
}
}
第四步:控制台結果