兩種讀對(duì)象的方式
- 確定表頭:建立對(duì)象,和表頭形成映射關(guān)系。
- 不確定表頭:每一行數(shù)據(jù)映射為
Map<String, Object>
,比如用戶自己上傳的表格。
兩種讀取模式
- 監(jiān)聽器:先創(chuàng)建監(jiān)聽器、在讀取文件時(shí)綁定監(jiān)聽器。單獨(dú)抽離處理邏輯,代碼清晰易于維護(hù);一條一條處理,適用于數(shù)據(jù)量大的場(chǎng)景。
- 同步讀:無需創(chuàng)建監(jiān)聽器,一次性獲取完整數(shù)據(jù)。方便簡(jiǎn)單,但是數(shù)據(jù)量大時(shí)會(huì)有等待時(shí)長(zhǎng),造成卡頓,也可能出現(xiàn)內(nèi)存溢出。
Easy Excel 基本使用
Easy Excel官網(wǎng)
- 導(dǎo)入依賴
<!-- easy Excel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.0</version>
</dependency>
- 需要讀取的類對(duì)象:
package com.heo.matchmatebackend.easyExcel;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
/**
* 用戶表格信息
*/
@Data
public class TableUserInfo {
/**
* 用戶編號(hào)
*/
@ExcelProperty("用戶編號(hào)") // 列名匹配(或者也可以用列數(shù) index=0 的方式進(jìn)行匹配第一列)
private String userCode;
/**
* 用戶昵稱
*/
@ExcelProperty("用戶昵稱")
private String username;
}
- 讀取監(jiān)聽器
package com.heo.matchmatebackend.easyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import lombok.extern.slf4j.Slf4j;
// 有個(gè)很重要的點(diǎn) TableListener 不能被spring管理,要每次讀取excel都要new,然后里面用到spring可以構(gòu)造方法傳進(jìn)去
@Slf4j
public class TableListener implements ReadListener<TableUserInfo> {
/**
* 這個(gè)每一條數(shù)據(jù)解析都會(huì)來調(diào)用
*
* @param data one row value. Is is same as {@link AnalysisContext#readRowHolder()}
* @param context
*/
@Override
public void invoke(TableUserInfo data, AnalysisContext context) {
System.out.println(data);
}
/**
* 所有數(shù)據(jù)解析完成了 都會(huì)來調(diào)用
*
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
System.out.println("已解析完成");
}
}
- 兩種讀取數(shù)據(jù)的方法
package com.heo.matchmatebackend.easyExcel;
import com.alibaba.excel.EasyExcel;
import java.util.List;
/**
* 導(dǎo)入Excel,讀取數(shù)據(jù)
*/
public class ImportExcel {
/**
* 讀取數(shù)據(jù)
*/
public static void main(String[] args) {
// 寫法1:JDK8+ ,不用額外寫一個(gè)DemoDataListener
// since: 3.0.0-beta1
// Excel數(shù)據(jù)文件放在自己電腦上,能夠找到的路徑
String fileName = "C:\\Codefield\\MY_PROJECT\\match-mate-backend\\src\\main\\resources\\testExcel.xlsx";
// readByListener(fileName);
synchronousRead(fileName);
}
/**
* 監(jiān)聽器讀取
* @param fileName
*/
public static void readByListener(String fileName) {
// 這里 需要指定讀用哪個(gè)class去讀,然后讀取第一個(gè)sheet 文件流會(huì)自動(dòng)關(guān)閉
// 這里每次會(huì)讀取100條數(shù)據(jù) 然后返回過來 直接調(diào)用使用數(shù)據(jù)就行
EasyExcel.read(fileName, TableUserInfo.class, new TableListener()).sheet().doRead();
}
/**
* 同步讀
* 同步的返回,不推薦使用,如果數(shù)據(jù)量大會(huì)把數(shù)據(jù)放到內(nèi)存里面,且響應(yīng)時(shí)間太久
*/
public static void synchronousRead(String fileName) {
// 這里 需要指定讀用哪個(gè)class去讀,然后讀取第一個(gè)sheet 同步讀取會(huì)自動(dòng)finish
List<TableUserInfo> list = EasyExcel.read(fileName).head(TableUserInfo.class).sheet().doReadSync();
for (TableUserInfo tableUserInfo : list) {
System.out.println(tableUserInfo);
}
}
}
- 實(shí)操案例
package com.heo.matchmatebackend.easyExcel;
import com.alibaba.excel.EasyExcel;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class ImportUser {
public static void main(String[] args) {
//Excel數(shù)據(jù)文件放在自己電腦上,能夠找到的路徑
String fileName = "C:\\Codefield\\MY_PROJECT\\match-mate-backend\\src\\main\\resources\\testExcel.xlsx";
// 這里 需要指定讀用哪個(gè)class去讀,然后讀取第一個(gè)sheet 同步讀取會(huì)自動(dòng)finish
List<TableUserInfo> userInfoList =
EasyExcel.read(fileName).head(TableUserInfo.class).sheet().doReadSync();
System.out.println("總數(shù) = " + userInfoList.size());
// 過濾username為空的信息,并分組為 map<列名,列數(shù)據(jù)的list>
Map<String, List<TableUserInfo>> listMap =
userInfoList.stream()
.filter(userInfo -> StringUtils.isNotEmpty(userInfo.getUsername()))
.collect(Collectors.groupingBy(TableUserInfo::getUsername));
for (Map.Entry<String, List<TableUserInfo>> stringListEntry : listMap.entrySet()) {
if (stringListEntry.getValue().size() > 1) {
System.out.println("username = " + stringListEntry.getKey());
// System.out.println("1");
}
}
System.out.println("不重復(fù)昵稱數(shù) = " + listMap.keySet().size());
}
}
文章來源:http://www.zghlxwxcb.cn/news/detail-810844.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-810844.html
到了這里,關(guān)于Java 讀取 Excel 表格—— Easy Excel 基本使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!