EasyExcel 简单读
1.轻描淡写
EasyExcel是一款有阿里开发者开发的快速、简单避免OOM(内存溢出)的java处理Excel工具,简单易上手。阿里出品必为精品;
2.使用攻略
作为一种开源工具,你可以点击 https://github.com/alibaba/easyexcel 查看EasyExcel的 github 开源社区的官方教程,提供了EasyExcel的使用方式。
给读者提供一个读excel的Demo,实测有效,😄
3.Demo
3.1 mvn项目可以直接引入easyExcel的pom,非mvn项目可以下载jar包,最新的版本为2.1.6,旧的版本也是可以用的,但有些方法会打上 @Deprecated注释显示过期不推荐使用,但不影响正常使用。
pom包如下:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.6</version>
</dependency>
3.2 读excel的内容到内存Demo
3.2.1 先建一个与excel对应的实体类来映射excel中的数据,如下:
@Data
public class UploadExcelDO extends BaseRowModel {
@ExcelProperty
private String id;
@ExcelProperty
private String name;
@DateTimeFormat("yyyy/MM/dd HH:mm:ss")
private Date date;
}
3.2.2 写一个工具类来存放监听器和读excel数据的方法,如下:
public class EasyExcelUtils {
/**
* 模型 解析监听器
*/
public static class ModelExcelListener extends AnalysisEventListener {
private List<Object> datas = new ArrayList<>();
@Override
public void invoke(Object object, AnalysisContext context) {
datas.add(object);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
}
public List<Object> getDatas() {
return datas;
}
public void setDatas(List<Object> datas) {
this.datas = datas;
}
}
/**
* 通过文件名直接读取excel
* @param filePath
* @param clazz 映射类 这里指UploadexcelDO.class
* @param headRowNumber 表头行数
* @return
*/
public static List<Object> readExcelFromLocalFilePath(String filePath,Class<? extends BaseRowModel> clazz,int headRowNumber){
ModelExcelListener listener = new ModelExcelListener();
EasyExcel.read(filePath, clazz, listener).sheet().headRowNumber(2).doRead();
return listener.getDatas();
}
public static List<Object> readExcelFromInputStream(InputStream inputStream,Class<? extends BaseRowModel> clazz, int headRowNumber) throws IOException {
ModelExcelListener listener = null;
try {
listener = new ModelExcelListener();
EasyExcel.read(inputStream, clazz, listener).sheet().headRowNumber(headRowNumber).doRead();
} finally {
if(inputStream!=null){
inputStream.close();
}
}
return listener.getDatas();
}
/**
* 从web上读取excel
* @param multipartFile
* @param headRowNumber
* @return
* @throws IOException
*/
public static List<Object> readExcelFromMultipartFile(MultipartFile multipartFile,Class<? extends BaseRowModel> clazz,int headRowNumber) throws IOException {
InputStream inputStream = multipartFile.getInputStream();
ModelExcelListener listener = null;
try {
listener = new ModelExcelListener();
EasyExcel.read(inputStream, clazz, listener).sheet().headRowNumber(headRowNumber).doRead();
} finally {
if (inputStream != null) {
inputStream.close();
}
}
return listener.getDatas();
}
}
3.2.3 写个测试类试一下
下列为从本地文件路径读的Test,工具类也提供了其他方式的读excel的方法,这里不一一例举
@Test
public void test(){
String path = "/Users/Desktop/12.xlsx";
List<Object> dataList = EasyExcelUtil.readExcelFromLocalFilePath(path,UploadExcelDO.class,1);
System.out.println(dataList);
}
3.2.4 运行效果
本地excel文件/Users/Desktop/12.xlsx
执行结果: