EasyExcel如何返回业务处理中的错误信息

前言

又又又接手老项目 进行改造… 之前poi写的excel导入会导致oom内存溢出,调了内存也没用 就用EasyExcel重写了下 基于原项目结构的写 确实好难受

一句话概括本文:

引用传递

开始

由于我需要基于原项目逻辑走 导入之后的各种校验需要根据service层的逻辑进行数据校验(这里我要基于原项目结构的写,easyexcel有数据校验注解具体看官方文档),

校验失败然后service层会抛出个异常,正常应该在controller层捕捉异常然后返回给页面的,但是在使用easyexcel 时候被重写方法是没有异常抛出的 根据java重写规则重写的方法只能比原方法抛出更小的异常,也就是说我在service层抛出异常 路过监听器的时候就已经没了

这时候想返回前台某一列数据校验失败就要用到值传递,

步骤:

在controller层初始化一个ajax返回对象 然后通过监听器的构造方法将返回对象传入 捕捉service的异常(或者你将错误信息返回出来也行,这个老项目写的是用异常将错误信息带出来) 将错误信息存到ajax返回对象就行,然后controller直接返回这个ajax对象

上代码:

controller

	@ResponseBody
	@RequestMapping(value = "orderImport", method = RequestMethod.POST, produces = Constant.CONTENT_TYPE_UTF8)
	public RestResponse orderImport(HttpServletRequest request,  @RequestParam(value = "file") MultipartFile file) throws Exception {
		UserVO userVo = this.getCurrentUser(request);

		// 初始化ajax返回对象 默认是操作成功
		RestResponse build = RestResponse.build();

		EasyExcel.read(file.getInputStream(), new NoModleDataListener(orderService, userVo, build)).sheet().doRead();
		// 直接返回  如果错误这个对象的值已被改变 如果没有错误值没有被改变 返回的是默认成功的对象
		return build;
		// return orderService.importOrder(userVo, file);
	}

监听器:


/**
 * @author: [青衫] 'QSSSYH@QQ.com'
 * @Date: 2020-01-07 11:09
 * @Description: < map接收解析数据-监听器 >
 */
public class NoModleDataListener extends AnalysisEventListener<Map<Integer, String>> {
	private static final Logger LOGGER = LoggerFactory.getLogger(NoModleDataListener.class);


	/**业务逻辑层*/
	private OrderService orderService;
	/**用户Vo*/
	private UserVO userVO;
	/**ajax返回对象*/
	private RestResponse build;
	/**excel头*/
	private Map<Integer, String> headMaps;


	/**
	 * 监听器构造方法
	 *
	 * @param orderService 业务逻辑层
	 * @param userVO       用户vo (Service业务使用)
	 * @param build        ajax返回对象
	 */
	public NoModleDataListener(OrderService orderService, UserVO userVO, RestResponse build) {
		this.orderService = orderService;
		this.userVO = userVO;
		this.build = build;
	}

	/**
	 * 每隔3000条存储数据库
	 */
	private static final int BATCH_COUNT = 3000;
	List<Map<Integer, String>> list = new ArrayList<Map<Integer, String>>();

	@Override
	public void invoke(Map<Integer, String> data, AnalysisContext context) {

		list.add(data);
		if (list.size() >= BATCH_COUNT) {
			try {
				saveData();
			} catch (Exception e) {
				build.setCode(1);
				build.setMsg(e.getMessage());
			}
			list.clear();
		}
	}

	@Override
	public void doAfterAllAnalysed(AnalysisContext context) {
		try {
			saveData();
		} catch (Exception e) {
            // 将返回对象code改为错误状态码
			build.setCode(1);
            // 存入错误信息
			build.setMsg(e.getMessage());
		}
	}


	@Override
	public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
		headMaps = headMap;
	}

	/**
	 * 存储数据库
	 */
	private void saveData() throws Exception {

		orderService.importOrders(userVO, list, headMaps);
		LOGGER.info("存储数据库成功!");
	}

    /**
    *解析出现错误会进入该方法 具体看源代码或文档
    */
	@Override
	public void onException(Exception exception, AnalysisContext context) throws Exception {
		System.out.println("hello");
		throw exception;
	}
}

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
EasyExcel,您可以通过自定义读取监听器来实现读取Excel时追加错误信息列的功能。 首先,您需要创建一个自定义的读取监听器类,实现`AnalysisEventListener`接口,重写`invoke`方法。在`invoke`方法,您可以处理每一行数据,并根据需要追加错误信息列。 以下是一个示例代码: ```java public class CustomReadListener extends AnalysisEventListener<DataDTO> { private List<DataDTO> dataList = new ArrayList<>(); @Override public void invoke(DataDTO data, AnalysisContext context) { // 处理每一行数据,并根据需要追加错误信息列 // ... // 将处理后的数据添加到列表 dataList.add(data); } @Override public void doAfterAllAnalysed(AnalysisContext context) { // 数据读取完成后的操作,例如写入数据库、导出错误信息等 // ... } public List<DataDTO> getDataList() { return dataList; } } ``` 然后,在您的代码使用该自定义的读取监听器来读取Excel文件。例如: ```java public class ExcelReader { public static void main(String[] args) { String fileName = "path/to/your/excel/file.xlsx"; CustomReadListener listener = new CustomReadListener(); ExcelReaderBuilder.read(fileName, DataDTO.class, listener).sheet().doRead(); List<DataDTO> dataList = listener.getDataList(); // 处理 dataList 的数据及错误信息列 // ... } } ``` 在上述示例,`DataDTO`是您自定义的数据对象,用于存储每一行的数据。您可以在`invoke`方法根据需要对数据进行处理,并将处理后的数据添加到`dataList`。在`doAfterAllAnalysed`方法,您可以进行数据读取完成后的操作,例如写入数据库或导出错误信息。 请注意,以上只是一个简单示例,具体的实现会根据您的需求和业务逻辑而有所不同。您可以根据实际情况对代码进行适当调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值