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;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/128868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中队列的数据结构

Java中的队列是一种基于先进先出&#xff08;FIFO&#xff09;原则的数据结构&#xff0c;它可以用来存储一组元素&#xff0c;并支持在队列的末尾添加元素&#xff0c;以及在队列的开头删除元素。Java中的队列可以通过Java集合框架中的Queue接口来实现&#xff0c;常用的实现类…

数据交易模型的扩展性,可操作性

目录 数据交易模型的扩展性,可操作性 模型的扩展性: 模型的可操作性: 数据交易模型的扩展性&

Pytest UI自动化测试实战实例

环境准备 序号库/插件/工具安装命令1确保您已经安装了python3.x2配置python3pycharmselenium2开发环境3安装pytest库pip install pytest4安装pytest -html 报告插件pip install pytest-html5安装pypiwin32库(用来模拟按键)pip install pypiwin326安装openpyxl解析excel文件库p…

论文辅助笔记:t2vec models.py

1 EncoderDecoder 1.1 _init_ class EncoderDecoder(nn.Module):def __init__(self, vocab_size, embedding_size,hidden_size, num_layers, dropout, bidirectional):super(EncoderDecoder, self).__init__()self.vocab_size vocab_size #词汇表大小self.embedding_size e…

leetcode_117 填充每个节点的下一个右侧节点指针 II

文章目录 1. 题意2. 题解2.1 BFS2.2 BFS空间优化2.3 DFS序层次记录 3. Ref 1. 题意 在一颗树的同层之间用指针把他们链接起来。 填充每个节点的下一个右侧节点指针 II 2. 题解 2.1 BFS 用一个变量记录下同层最右侧的节点&#xff0c;当遍历到时更新下一层的最右侧节点即可…

2023-11-03 C++ 类型擦除与状态保留

点击 <C 语言编程核心突破> 快速C语言入门 C 类型擦除与状态保留 前言一、一个正常的继承和多态二、一个不太正常的继承和多态三、试图构建能类型抹除但保留状态的mySharedPtr类总结 前言 要解决问题: 在C中, 类型决定着对象的数据存储和解释, 以及方法. 通过继承和虚…

R语言使用surveyCV包对NHANES数据(复杂调查加权数据)进行10折交叉验证

美国国家健康与营养调查&#xff08; NHANES, National Health and Nutrition Examination Survey&#xff09;是一项基于人群的横断面调查&#xff0c;旨在收集有关美国家庭人口健康和营养的信息。 地址为&#xff1a;https://wwwn.cdc.gov/nchs/nhanes/Default.aspx 既往咱们…

ES6、ES7、ES8的特性是什么?

ES6、ES7、ES8都是JavaScript语言的版本,它们具有一些新的特性和变化。 ES6(ECMAScript 2015)引入了很多重要的新特性,包括: 1: 类(class):对熟悉Java,object-c,c#等纯面向对象语言的开发者来说,都会对class有一种特殊的情怀。ES6 引入了class(类),让JavaScri…

Kubernetes群集调度

调度约束 Kubernetes 是通过 List-Watch 的机制进行每个组件的协作&#xff0c;保持数据同步的&#xff0c;每个组件之间的设计实现了解耦。 用户是通过 kubectl 根据配置文件&#xff0c;向 APIServer 发送命令&#xff0c;在 Node 节点上面建立 Pod 和 Container。 APIServ…

Linux 服务器 Oracle19C安装

原文:【精选】Oracle | CentOS7安装Oracle19c数据库(RPM包)_oracle-database-preinstall-19c-1.0-1.el7.x86_64.rp_Thorolds Deer的博客-CSDN博客 下载 第一个软件包:Oracle Database 19c Download for Linux x86-64 第二个包:Oracle Linux 7 (x86_64) Latest | Oracle,…

Python-loguru-跨进程的日志服务器-django

文章目录 1.安装2.基础配置3.具体使用4.总结 1.安装 pip install loguru2.基础配置 可以在包的初始化文件中使用。 # -*- coding : utf-8-*- from pathlib import Path from loguru import logger#初始化日志系统 def InitLog():ROOT_DIR Path(__file__).resolve().parent.…

免费(daoban)gpt,同时去除广告

一. 内容简介 免费(daoban)gpt&#xff0c;同时去除广告&#xff0c;https://chat18.aichatos.xyz/&#xff0c;也可当gpt用&#xff0c;就是有点广告&#xff0c;大家也可以支持一下 二. 软件环境 2.1 Tampermonkey 三.主要流程 3.1 创建javascript脚本 点击添加新脚本 …

自己设计一个自动化测试框架

在进行自动化框架设计之前我们先来看两个问题&#xff0c;什么是自动化框架&#xff0c;设计的时候应该注意什么原则&#xff0c;然后该怎么做&#xff1f;本文会以一个web端的UI自动化测试框架设计为例 什么是自动化测试框架 什么是框架 特指为解决一个开放性问题而设计的具…

香港服务器不稳定的几种情况

​  近年来&#xff0c;随着互联网的迅猛发展&#xff0c;香港作为一个重要的网络枢纽地区&#xff0c;扮演着连接中国内地和国际网络的重要角色。一些用户表示在使用香港服务器时可能会遇到不稳定的情况&#xff0c;导致访问困难、加载缓慢甚至无法连接。 为什么香港服务器会…

uni-app 开发的H5 定位功能部署注意事项

一、H5部署的时候&#xff0c;如果设计到定位功能&#xff0c;需要注意以下几点 1、打包部署的时候需要在Web配置-定位和地图里面勾选一个地图&#xff0c;并配置key 2、打包部署需要域名是https协议的&#xff0c;大多数现代浏览器要求在HTTPS协议下才能够访问地理位置信息&a…

C/C++ system()函数的常用参数详解

文章目录 一、头文件二、system使用案例1. 执行系统命令2. 运行可执行程序3. 删除文件或目录4. 复制文件或目录5. 创建目录6. 网络操作7. 修改文件权限8. 查看系统信息9. 获取脚本结果在Linux操作系统下, system() 函数可以用来执行shell命令。你可以传递不同的命令字符串作为…

对于numpy.linalg和scipy.linalg(待完善)

这俩部分都是用于线性代数的计算&#xff0c;但是存在一些差别&#xff0c;下面是使用中出现的问题&#xff1a; 首先说明的是计算矩阵的伪逆的时候&#xff1a;np.linalg.pinv和scipy.linalg.pinv都是用于计算矩阵伪逆的&#xff0c;二者得到结果并不一致&#xff0c;只能说是…

如何快速使用Vue3在electron项目开发chrome Devtools插件

1、建立Vue项目 为了方便快速建立项目&#xff0c;我已经写好脚手架&#xff0c;直接clone项目&#xff0c;快速开发 点击快速进入源代码 拉取代码 git clone https://github.com/xygengcn/electron-devtool.git安装依赖 yarn运行项目 yarn dev打包项目 yarn build2、安装…

CentOS 搭建 Hadoop3 高可用集群

Hadoop FullyDistributed Mode 完全分布式 spark101spark102spark103192.168.171.101192.168.171.102192.168.171.103namenodenamenodejournalnodejournalnodejournalnodedatanodedatanodedatanodenodemanagernodemanagernodemanagerrecource managerrecource managerjob hist…

【Spring Boot】发送邮件功能

发送邮件功能 一.pom.xml文件添加邮件依赖二.发送邮件信息&#xff08;1&#xff09;固定配置在application.yml&#xff08;2&#xff09;发送邮箱配成活&#xff08;3&#xff09;底层发送邮件方法&#xff08;4&#xff09;QQ邮箱开通smtp服务&#xff08;5&#xff09;网易…