阿里云EasyExcel读取excel表数据
1、待读取的excel表test.xls
2、导入Maven依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.6</version>
</dependency>
3、创建对应excel表实体
- @ExcelProperty注解对应excel表头,可根据自身需求添加属性
@Data
public class NExcelModelData {
/**
* 文件名称
*/
@ExcelProperty("文件名称")
private String fileName;
/**
* 文件大小
*/
@ExcelProperty("文件大小")
private BigDecimal fileSize;
}
4、读Excel
- 先获取文件流,比如 test.xls;
- NExcelModelData是一个对应excel表的解析类;
- NExcelModelDataListener中进行读取到的数据处理
//读取excel
EasyExcel.read(modelFile.getInputStream(),
NExcelModelData.class,
new NExcelModelDataListener())
.sheet().doRead();
- NExcelModelDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
public class NExcelModelDataListener extends AnalysisEventListener<NExcelModelData> {
private static final Logger logger = LoggerFactory.getLogger(NExcelModelDataListener.class);
//临时存储
public static Map<String, NMetaData> map = new HashMap<>();
/**
* 每隔5条存储数据库,实际使用中可以50条自己定义即可,然后清理list ,方便内存回收
*/
private static final int BATCH_COUNT = 5;
/**
* 缓存的数据
*/
private List<NExcelModelData> nExcelModelDataList = new ArrayList<>();
/**
* 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
*/
private FileService fileService;
public NExcelModelDataListener() {
// 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数
fileService= new FileService ();
}
/**
* 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
*
* @param fileService
*/
public DemoDataListener(FileService fileService) {
this.fileService= fileService;
}
/**
* 这个每一条数据解析都会来调用
*
* @param newExcelModelData
* @param analysisContext
*/
@Override
public void invoke(NExcelModelData newExcelModelData, AnalysisContext analysisContext) {
logger.info("读取excel数据为:", JSON.toJSONString(newExcelModelData));
nExcelModelDataList.add(newExcelModelData);
logger.info("-------excel数据读取到第" + nExcelModelDataList.size() + "条-------");
// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
if (nExcelModelDataList.size() >= BATCH_COUNT) {
saveData();
//清空集合,防止内存溢出
nExcelModelDataList.clear();
}
}
/**
* 所有数据解析完成了 都会来调用
*
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
// 保存最后解析出来的数据
saveData();
logger.info("-------------excel数据读取完毕--------------");
}
/**
* 执行的业务操作:
*
* 1、此处可根据自身需求,进行对应业务存储处理(我这里是临时用map保存,因为后边要调用),可参考下面注释行代码
*
* 2、也可直接进行简单的入库操作
*/
public void saveData() {
logger.info("------excel记录数:" + nExcelModelDataList.size() + "条----");
//fileService.saveNExcelToMetadataData(nExcelModelDataList, map);
fileService.save(nExcelModelDataList );
logger.info("--------元数据成功返回-------------------");
}
}
到此,阿里云工具EasyExcel读excel表格数据小案例就完成了,有兴趣的小伙伴可以自己去测试下!!!
5、写Excel
推荐2篇写Excel数据贼详细的文章: