当前位置: 首页 > news >正文

Layui上传Excel, 并返回每行导入的结果

前端代码

<button type="button" class="layui-btn" id="uploadExcel"><i class="fa fa-lg fa-file-excel-o"></i> 上传Excel
</button>layui.config({base: 'assets/layuiadmin/' //静态资源所在路径}).extend({index: 'lib/index', //主入口模块excel: 'layui_exts/excel'}).use(['form', 'upload' , 'excel'], function(){var form = layui.form;var excel = layui.excel;var timestart = Date.now();var uploadLoading;// Excel上传layui.upload.render({elem: '#uploadExcel',url: 'uploadexcel',accept: 'file',exts: 'xlsx',data: {},field: 'excel',before: function() {this.data = { "name": "动态携带参数"};uploadLoading = layer.msg('正在导入中,请稍候...', {icon: 16, time: 0, shade: 0.3});timestart = Date.now();},done: function(data) {console.log(data);// 弹窗. 显示导入结果var array = new Array();for(var key in data) {array.push({ "number" : key , "result" : data[key]})}layer.close(uploadLoading);exportApi(array);},error: function(data, index){layer.close(uploadLoading);if(data != null) {top.dialog.msg(data.msg);}},});function exportApi(list) {var loadLayerIndex = top.dialog.msg("正在导出Excel数据中...", {icon: 16, time: 0, shade: 0.3});/*** v:单元格的值* t:单元格的类型 'b'布尔值、'n'数字、'e'错误、's'字符串、'd'日期* s:单元格的样式*/var data = [{number: getExcelFormat("行号", true , '000000'),result: getExcelFormat("结果", true , '000000'),}];for(var i = 0 ; i < list.length; i++) {data.push({number:getExcelFormat(list[i].number, false , '000000'),result:getExcelFormat(list[i].result, list[i].result.indexOf("成功") != -1 ? false : true, list[i].result.indexOf("成功") != -1 ? 'FF9900' : 'FF0000')});}// A列宽 200, 默认给80var colConf = excel.makeColConfig({'A': 150,'B': 450,}, 140);// 每一行的行高, 默认给20var rowConf = excel.makeRowConfig({1: 30,}, 20)excel.exportExcel({sheet1: data}, "数据导入结果"  + '.xlsx', 'xlsx', {extend: {sheet1: {'!cols': colConf, '!rows': rowConf}}})var timeend = Date.now()var spent = (timeend - timestart) / 1000top.dialog.close(loadLayerIndex);layer.msg('导入耗时 :' + spent + ' 秒');}
});


Java后台代码

@PostMapping("uploadexcel")public synchronized JSONObject saveUploadExcel(MultipartFile excel, String name) {String extName = ""; // 扩展名格式:String saveFilePath = "";try {if (excel.getOriginalFilename().lastIndexOf(".") >= 0){extName = excel.getOriginalFilename().substring(excel.getOriginalFilename().lastIndexOf("."));}if (!extName.equals(".xlsx")) {throw new SaveException("文件格式错误");}String fileName = UUIDUtil.getUUID();File file = new File(fileProperties.getUploadPath());if(!file.exists()) {file.mkdirs();}File saveFile = new File(fileProperties.getUploadPath() + File.separator + "tempFile" + File.separator + fileName +  extName);FileUtils.copyInputStreamToFile(excel.getInputStream(), saveFile);saveFilePath = fileProperties.getUploadPath() + File.separator + "tempFile" + File.separator + fileName +  extName;} catch (IOException e) {e.printStackTrace();}JSONObject json = new JSONObject();try {json = execlUpload(saveFilePath);}catch(Exception e) {e.printStackTrace();}return json;}public JSONObject execlUpload(String saveFilePath) {File areaDataFile = new File(saveFilePath);JSONObject resultMap = new JSONObject();final int[] lineNumber = {1};final int[] starNumber = {1};final int[] notData = {0};final Map<String, Integer> identityMap = new HashMap<String, Integer>();// 读取第一个sheet 文件流会自动关闭EasyExcel.read(areaDataFile, new AnalysisEventListener<Map<Integer, String>>() {//直接使用Map来保存数据@Overridepublic void invoke(Map<Integer, String> rowData, AnalysisContext context) {lineNumber[0] = lineNumber[0] +1;if (starNumber[0] > lineNumber[0]) {return;}int currentLineNumber = lineNumber[0];Map<String, Object> saveMap = new HashMap<String, Object>();List<Map<String, Object>> queryList = new ArrayList<Map<String, Object>>();String identity = rowData.get(0) == null ? "" : rowData.get(0).trim();// 获取每行第一列// 判断本行是否有效if (StringUtil.isEmpty(identity)) {resultMap.put(currentLineNumber + "", "该行无效");notData[0] = notData[0] + 1;return;} else {notData[0] = 0;}// 连续3行无效则不再继续if(notData[0] > 3) {return;}// 判断是否有重复if (identityMap.get(identity) != null) {resultMap.put(currentLineNumber + "", "身份证号与第" + identityMap.get(identity) + "行重复");return;}else{identityMap.put(identity, currentLineNumber);}// 对数据校验if (!IdCardVerifyUtil.isIDCard(identity) ) {resultMap.put(currentLineNumber + "", "格式错误");return;}try{// 做存储等操作resultMap.put(currentLineNumber + "", "处理成功");}catch(Exception e) {resultMap.put(currentLineNumber + "", "处理失败【" + e.getLocalizedMessage() + "】");e.printStackTrace();}}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {//所有行都解析完成}}).sheet().headRowNumber(1).doRead();return resultMap;}

相关文章:

  • 进口跨境商城源码:高效、安全、可扩展的电商平台解决方案
  • 【Linux】Linux+Nginx部署项目(负载均衡动静分离)
  • 搜索与图论:匈牙利算法
  • 【Java 进阶篇】Java ServletContext详解:在Web应用中获取全局信息
  • 喜欢 Android 14 的 14 个理由
  • Content-Type 值有哪些?
  • 【数据结构】堆排序
  • Java调用HTTPS接口,绕过SSL认证
  • 项目实战:封装响应结果以及抽取响应代码到工具类
  • 记录 vue + vuetify + electron 安装过程
  • 数据分析在程序员职业中的重要性及实践应用
  • AM@变系数线性微分方程中的可常系数化类型@欧拉方程
  • NI-9236 国产化10 kS/s/ch,350 Ω四分之一桥应变计,8通道C系列应变/桥输入模块
  • Python 正则表达式(RegEx)指南
  • 设计模式大赏(一):桥接模式,组合模式
  • chrome扩展demo1-小时钟
  • docker-consul
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • HTML中设置input等文本框为不可操作
  • learning koa2.x
  • Linux Process Manage
  • Mac转Windows的拯救指南
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • react 代码优化(一) ——事件处理
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 高度不固定时垂直居中
  • 诡异!React stopPropagation失灵
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 技术发展面试
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 再次简单明了总结flex布局,一看就懂...
  • 在weex里面使用chart图表
  • 责任链模式的两种实现
  • ​io --- 处理流的核心工具​
  • ​插件化DPI在商用WIFI中的价值
  • #Linux(权限管理)
  • (04)odoo视图操作
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (Python) SOAP Web Service (HTTP POST)
  • (第二周)效能测试
  • (二十四)Flask之flask-session组件
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (转)setTimeout 和 setInterval 的区别
  • (转载)利用webkit抓取动态网页和链接
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • ./configure,make,make install的作用
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET Framework 服务实现监控可观测性最佳实践
  • .net 使用ajax控件后如何调用前端脚本
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .net下简单快捷的数值高低位切换