Browse Source

文件上传测试案例的一些修改

pull/2548/head
nieyingping 3 years ago
parent
commit
7967dadfe7
  1. 41
      easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/web/UploadDataListener.java
  2. 5
      easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/web/WebTest.java

41
easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/web/UploadDataListener.java

@ -8,14 +8,19 @@ import com.alibaba.excel.util.ListUtils;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
/** /**
* 模板的读取类 * 模板的读取类
* *
* @author Jiaju Zhuang * @author Jiaju Zhuang
*/ */
// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
@Slf4j @Slf4j
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class UploadDataListener implements ReadListener<UploadData> { public class UploadDataListener implements ReadListener<UploadData> {
/** /**
* 每隔5条存储数据库实际使用中可以100条然后清理list 方便内存回收 * 每隔5条存储数据库实际使用中可以100条然后清理list 方便内存回收
@ -25,22 +30,9 @@ public class UploadDataListener implements ReadListener<UploadData> {
/** /**
* 假设这个是一个DAO当然有业务逻辑这个也可以是一个service当然如果不用存储这个对象没用 * 假设这个是一个DAO当然有业务逻辑这个也可以是一个service当然如果不用存储这个对象没用
*/ */
@Autowired
private UploadDAO uploadDAO; private UploadDAO uploadDAO;
public UploadDataListener() {
// 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数
uploadDAO = new UploadDAO();
}
/**
* 如果使用了spring,请使用这个构造方法每次创建Listener的时候需要把spring管理的类传进来
*
* @param uploadDAO
*/
public UploadDataListener(UploadDAO uploadDAO) {
this.uploadDAO = uploadDAO;
}
/** /**
* 这个每一条数据解析都会来调用 * 这个每一条数据解析都会来调用
* *
@ -54,8 +46,6 @@ public class UploadDataListener implements ReadListener<UploadData> {
// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
if (cachedDataList.size() >= BATCH_COUNT) { if (cachedDataList.size() >= BATCH_COUNT) {
saveData(); saveData();
// 存储完成清理 list
cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
} }
} }
@ -67,7 +57,9 @@ public class UploadDataListener implements ReadListener<UploadData> {
@Override @Override
public void doAfterAllAnalysed(AnalysisContext context) { public void doAfterAllAnalysed(AnalysisContext context) {
// 这里也要保存数据,确保最后遗留的数据也存储到数据库 // 这里也要保存数据,确保最后遗留的数据也存储到数据库
saveData(); if (cachedDataList.size() > 0) {
saveData();
}
log.info("所有数据解析完成!"); log.info("所有数据解析完成!");
} }
@ -77,6 +69,19 @@ public class UploadDataListener implements ReadListener<UploadData> {
private void saveData() { private void saveData() {
log.info("{}条数据,开始存储数据库!", cachedDataList.size()); log.info("{}条数据,开始存储数据库!", cachedDataList.size());
uploadDAO.save(cachedDataList); uploadDAO.save(cachedDataList);
cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
log.info("存储数据库成功!"); log.info("存储数据库成功!");
} }
/**
* 保证在invoke解析数据或者写入数据库发生异常都能将cachedDataList清理
* @param exception
* @param context
* @throws Exception
*/
@Override
public void onException(Exception exception, AnalysisContext context) throws Exception {
cachedDataList.clear();
ReadListener.super.onException(exception, context);
}
} }

5
easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/web/WebTest.java

@ -17,6 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -29,7 +30,7 @@ import org.springframework.web.multipart.MultipartFile;
public class WebTest { public class WebTest {
@Autowired @Autowired
private UploadDAO uploadDAO; private UploadDataListener uploadDataListener;
/** /**
* 文件下载失败了会返回一个有部分数据的Excel * 文件下载失败了会返回一个有部分数据的Excel
@ -93,7 +94,7 @@ public class WebTest {
@PostMapping("upload") @PostMapping("upload")
@ResponseBody @ResponseBody
public String upload(MultipartFile file) throws IOException { public String upload(MultipartFile file) throws IOException {
EasyExcel.read(file.getInputStream(), UploadData.class, new UploadDataListener(uploadDAO)).sheet().doRead(); EasyExcel.read(file.getInputStream(), UploadData.class, uploadDataListener).sheet().doRead();
return "success"; return "success";
} }

Loading…
Cancel
Save