springboot导入EXCEL数据10+浏览器等待超时问题
解决办法异步导入法:
- 前台js解决思路:调用导入按钮后,把前台相应的操作按钮置为不可用,每个10秒查询一次导入结果返回值,直到查询到导入成功或失败的返回值后,将后续的操作按钮置为可用状态
关键代码如下:
com.langyashi.dialog.asyncImportExcel({ ctx: "${ctx}", excelMapper: xmlNameStr, queryParams: { headerId: headerId, poSegment1: poSegment1, orderTable: orderTable, orderPKName: headerId }, errorWriteback: true,//错误回写导入文件 callbackFun: function (resultData) { if (resultData.code == '0') { var message = "导入成功,送货单号" + segment1 + "已生成,请等待装箱信息验证成功后才可提交单据。验证错误文件请查看页面上“异步验证错误文件”附件。"; BootstrapDialog.alert(message, function () { }); setTimeout(function () { let intervalId = setInterval(function () { var result = com.langyashi.dialog.getAsyncImportResult({ ctx: "${ctx}", orderTable: orderTable, orderPKName: headerId }); if (result.code != "") { //停止轮询 clearInterval(intervalId); intervalId = null; $("#daoruannv").attr("disabled",false); $("#daoru").attr("disabled",false); //导入成功或者失败时,//刷新错误附件 if (result.code == "END_ERROR" || result.code == "END_SUCCESS") { var fileName = com.langyashi.dialog.getAsycImportErroFile('${ctx}',orderTable,headerId); $("#asyncImportFileName").text(fileName); } //导入成功后,刷新数据行 if (result.code == "END_SUCCESS") { refreshDeliverLines(); queryTotal(); } //导入异常,提示信息 if (result.code == "END_EXCEPTION") { BootstrapDialog.alert("导入失败:" + result.message, function () { }); } } }, 10000); }, 5000) } else { BootstrapDialog.alert(resultData.message, function () { }); } } });
后台实现类,先删除之前导入的数据,然后创建子线程导入
Map<String, Object> resultret = new HashMap<>(); resultret.put("code", "0"); try { String excelMapperFileName = excelImportParams.getExcelMapper(); ExcelMapper excelMapper = ExcelConfigUtils.generateExcelMapper(excelMapperFileName); MultipartFile file = excelImportParams.getExcelfile(); Workbook workbook = WorkbookFactory.create(file.getInputStream()); //回调服务增加登陆用户id int currentUserId = "123456"; //解析后的Excel数据表对象 Map excelData = ExcelReadUtils.parseExcel(excelMapper, workbook); //异步校验用变量 Workbook finalWorkbook = workbook; Map finalExcelData = excelData; ExcelMapper finalExcelMapper = excelMapper; String orderType = "IMPORT_EXCEL"; String orderTable = (String) excelImportParams.getQueryParamsMap().get("orderTable"); Object orderPKNameO = excelImportParams.getQueryParamsMap().get("orderPKName"); String orderPKName = String.valueOf(orderPKNameO); //删除导入历史 IesAsyncImportLog logParm = new IesAsyncImportLog(); logParm.setOrderTable(orderTable); logParm.setOrderPkValue(orderPKName); asyncImportLogService.deleteByOrder(logParm); new Thread(new Runnable() { @Override public void run() { String logResult = ""; String logErrorMessage = ""; try { //导入成功后调用服务处理数据 ExceldpCallbackService service = (ExceldpCallbackService) applicationContext.getBean(Class.forName (finalExcelMapper.getCallbackBean())); ExceldpResult result = service.afterImportExcel(excelImportParams.getQueryParamsMap(), finalExcelData); //删除之前的错误文件 AttachmentParam attachmentParam = new AttachmentParam(); attachmentParam.setOrderPKName(orderPKName); attachmentParam.setOrderTable(orderTable); attachmentParam.setOrderType(orderType); AttachmentForm attachmentForm = attachmentService.getAttachmentForm(attachmentParam); for (Attachment att : attachmentForm.getAttachmentList()) { attachmentService.delete(att.getOrderPKValue()); } //验证有问题时回写错误并上传错误文件 if (!result.isSucceed()) { errorWriteback(finalWorkbook, finalExcelData, finalExcelMapper); DateFormat dformat = new SimpleDateFormat("yyyyMMdd-HHmmss"); String dateTime = dformat.format(new Date()); String fileName = String.format("[error][%s]%s", dateTime, file.getOriginalFilename()); Attachment attachment = new Attachment(); attachment.setOrderType(orderType); attachment.setOrderTable(orderTable); attachment.setOrderPKName(orderPKName); attachment.setFileName(fileName); attachment.setFileType(file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1)); attachmentService.saveWorkbookForAtt(attachment, finalWorkbook); logResult = "END_ERROR"; } else { logResult = "END_SUCCESS"; } } catch (Throwable e) { logResult = "END_EXCEPTION"; logErrorMessage = e.getMessage(); logger.error("文件导入异常.", e); } finally { IesAsyncImportLog logParmInsert = new IesAsyncImportLog(); logParmInsert.setId(UUIDHexGenerator.getInstance().generate()); logParmInsert.setImportResult(logResult); logParmInsert.setOrderTable(orderTable); logParmInsert.setOrderPkValue(orderPKName); logParmInsert.setCreatedBy(currentUserId); logParmInsert.setCreationDate(new Date()); logParmInsert.setErrorMessage(logErrorMessage); asyncImportLogService.insert(logParmInsert); } } }).start(); } catch (Exception e) { resultret.put("code", "1"); resultret.put("message", e.getMessage()); } return resultret;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了