EasyExcel 基礎(chǔ)入門
1. 簡(jiǎn)介:
EasyExcel是一個(gè)基于Java的簡(jiǎn)單夕凝、省內(nèi)存的讀寫Excel的開源項(xiàng)目。在盡可能節(jié)約內(nèi)存的情況下支持讀寫百M(fèi)的Excel奏寨。
2.官方網(wǎng)站
https://github.com/alibaba/easyexcel
快速開始:https://www.yuque.com/easyexcel/doc/easyexcel
3. EasyExcel特點(diǎn)
- Java領(lǐng)域解析、生成Excel比較有名的框架有Apache poi、jxl等淫痰。但他們都存在一個(gè)嚴(yán)重的問題就是非常的耗內(nèi)存。如果你的系統(tǒng)并發(fā)量不大的話可能還行整份,但是一旦并發(fā)上來后一定會(huì)OOMZ或者JVM頻繁的full gc待错。
- EasyExcel是阿里巴巴開源的一個(gè)excel處理框架,以使用簡(jiǎn)單皂林、節(jié)省內(nèi)存著稱朗鸠。EasyExcel能大大減少占用內(nèi)存的主要原因是在解析Excel時(shí)沒有將文件數(shù)據(jù)一次性全部加載到內(nèi)存中,而是從磁盤上一行行讀取數(shù)據(jù)础倍,逐個(gè)解析(代碼中會(huì)有體現(xiàn))烛占。
- EasyExcel采用一行一行的解析模式,并將一行的解析結(jié)果以觀察者的模式通知處理(AnalysisEventListener)沟启。
pom.xml 引入依賴
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.7</version>
</dependency>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
4.最簡(jiǎn)單的寫
1.創(chuàng)建實(shí)體類
package com.atguigu.easyexcel.entity;
@Data
public class ExcelStudentData {
@ExcelProperty("姓名")
private String name;
@ExcelProperty("生日")
private Date birthday;
@ExcelProperty("薪資")
private Double salary;
/**
* 忽略這個(gè)字段
*/
@ExcelIgnore
private String password;
}
2.測(cè)試用例
- 07版本的Excel和03版本的寫入方式有所不同
- 03版本的Excel寫入最多一次可寫65536行 R浼摇!5录!Q壳洹!(取除表格65535行胳搞,其實(shí)就怕占用過多內(nèi)存卸例,讓機(jī)器宕機(jī))
public class WriteTest {
@Test
public void simpleExcelWrit07(){
String fileName = "G:\\5.項(xiàng)目\\谷粒學(xué)院\\java\\aliyunEasyExcel\\test01-07.xlsx";
EasyExcel.write(fileName, ExcelStudentData.class)
.sheet("Sheet1")
.doWrite(data());
}
@Test
public void simpleExcelWrit03(){
String fileName = "G:\\5.項(xiàng)目\\谷粒學(xué)院\\java\\aliyunEasyExcel\\test01-03.xls";
EasyExcel.write(fileName, ExcelStudentData.class)
.excelType(ExcelTypeEnum.XLS)
.sheet("Sheet1")
.doWrite(data());
}
public List<ExcelStudentData> data(){
List<ExcelStudentData> list = new ArrayList<ExcelStudentData>();
for (int i = 0; i < 10; i++) {
ExcelStudentData student = new ExcelStudentData();
student.setName("summer"+i);
student.setBirthday(new Date());
student.setSalary(0.232);
list.add(student);
}
return list;
}
}
03寫的時(shí)候:
EasyExcel.write(fileName, ExcelStudentData.class)
.excelType(ExcelTypeEnum.XLS)
.sheet("Sheet1")
.doWrite(data());
多一個(gè).excelType(ExcelTypeEnum.XLS)
注意:
使用07寫的方式確實(shí)可以寫03版的Excel称杨,但是這樣寫出的文件再使用03版讀不出來了。
我們?cè)趯懙臅r(shí)候一定要注意文件后綴
03 -> .xls
07 ->.xlsx
3.指定寫入列
為列配置 index 屬性
package com.atguigu.easyexcel.entity;
@Data
public class ExcelStudentData {
@ExcelProperty(value = "姓名", index = 0)
private String name;
@ExcelProperty(value = "生日", index = 1)
private Date birthday;
/**
* 這里設(shè)置3 會(huì)導(dǎo)致第二列空的
*/
@ExcelProperty(value = "薪資", index = 3)
private Double salary;
/**
* 忽略這個(gè)字段
*/
@ExcelIgnore
private String password;
}
1596893288829.png
4.自定義格式轉(zhuǎn)換
配置時(shí)間格式:@DateTimeFormat
配置數(shù)字格式:@NumberFormat
package com.atguigu.easyexcel.entity;
@Data
public class ExcelStudentData {
@ExcelProperty(value = "姓名")
private String name;
@DateTimeFormat("yyyy年MM月dd日HH時(shí)mm分ss秒")
@ExcelProperty(value = "生日")
private Date birthday;
@NumberFormat("#.##%")//百分比表示筷转,保留兩位小數(shù)
@ExcelProperty(value = "薪資")
private Double salary;
/**
* 忽略這個(gè)字段
*/
@ExcelIgnore
private String password;
}
5.最簡(jiǎn)單的讀
1姑原、參考文檔
https://www.yuque.com/easyexcel/doc/read
2、創(chuàng)建監(jiān)聽器
EasyExcel是阿里巴巴開源的一個(gè)excel處理框架呜舒,以使用簡(jiǎn)單锭汛、節(jié)省內(nèi)存著稱。EasyExcel能大大減少占用內(nèi)存的主要原因是在解析Excel時(shí)沒有將文件數(shù)據(jù)一次性全部加載到內(nèi)存中袭蝗,而是從磁盤上一行行讀取數(shù)據(jù)唤殴,逐個(gè)解析(代碼中會(huì)有體現(xiàn))。
public class ExcelStudentDataListener extends AnalysisEventListener<ExcelStudentData> {
// 設(shè)置閾值當(dāng)讀取行數(shù)達(dá)到閾值時(shí)到腥,就將數(shù)據(jù)存入數(shù)據(jù)庫(kù)
// 避免內(nèi)占用過多朵逝,導(dǎo)致內(nèi)存溢出
private final static int BASE_COUNT = 3;
// 使用list集合存儲(chǔ)數(shù)據(jù)
private List<ExcelStudentData> list = new ArrayList<ExcelStudentData>();
/**
* 每讀一行就執(zhí)行一次invoke
* @param data 每行數(shù)據(jù)
* @param context
*/
public void invoke(ExcelStudentData data, AnalysisContext context) {
System.out.println(data);
list.add(data);
if (list.size()>BASE_COUNT){
System.out.println("數(shù)據(jù)存入數(shù)據(jù)庫(kù)");
System.out.println("清空l(shuí)ist");
list.clear();
}
}
/**
* Excel全部數(shù)據(jù)讀取結(jié)束執(zhí)行此方法
* @param context
*/
public void doAfterAllAnalysed(AnalysisContext context) {
System.out.println("將剩余的數(shù)據(jù)讀入數(shù)據(jù)庫(kù)");
System.out.println("數(shù)據(jù)讀取結(jié)束");
}
}
3、測(cè)試用例
public class ReadTest {
/**
* 最簡(jiǎn)單的讀
*/
@Test
public void ReadTest07(){
String fileName = "G:\\5.項(xiàng)目\\谷粒學(xué)院\\java\\aliyunEasyExcel\\test01-07.xlsx";
// 這里默認(rèn)讀取第一個(gè)sheet
EasyExcel.read(fileName, ExcelStudentData.class, new ExcelStudentDataListener()).sheet().doRead();
}
@Test
public void ReadTest03(){
String fileName = "G:\\5.項(xiàng)目\\谷粒學(xué)院\\java\\aliyunEasyExcel\\test01-03.xls";
// 這里默認(rèn)讀取第一個(gè)sheet
EasyExcel.read(fileName, ExcelStudentData.class, new ExcelStudentDataListener()).excelType(ExcelTypeEnum.XLS).sheet(0).doRead();
}
}
1596893313184.png