监听器(非常核心的一段代码)
注:在监听器中,得到的list类型是不能被Service调用的,需要在监听器中定义有参Service,然后在Controller层里面去调用。直接拿监听器里面的list使用会报空指针异常。
package com.wql.codebase.controller;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import com.wql.codebase.pojo.ProjectCycle;
import com.wql.codebase.service.ProjectCycleService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
public class DemoDataListener extends AnalysisEventListener<ProjectCycle> {
private static final Logger LOGGER = LoggerFactory.getLogger(DemoDataListener.class);
/**
* 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
*/
private static final int BATCH_COUNT = 5;
List<ProjectCycle> list = new ArrayList<ProjectCycle>();
private ProjectCycleService projectCycleService;
/**
*如果要存取数据库,service从监听器里面拿取list就需要有参构造,否则直接使用会报空指针异常
*/
public DemoDataListener(ProjectCycleService projectCycleService) {
this.projectCycleService=projectCycleService;
}
/**
* 这个每一条数据解析都会来调用
*
* @param context
*/
@Override
public void invoke(ProjectCycle data, AnalysisContext context) {
// System.out.println(JSON.toJSONString(projectCycle));
LOGGER.info("111",JSON.toJSONString(data));
System.out.println(JSON.toJSONString(data));
list.add(data);
// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
if (list.size</