批量上传Excel文件

利用EXCEL文件批量上传用户信息 批量导入用户信息 批量导入通常是将指定格式的excel或word文件上传到服务器,服务器读取上传的文件内容,将文件内容全部读取到数据库的过程。 此案例包括:文件下载、文件上传、EXCEL文件解析、将解析后的数据存入数据库。 操作步骤:一、预备工作0、引入包文件上传:commons-fileupload-1.2.2.jar、commons-io-2.1.jar文件下载:不需要JAR包支持XL 阅读详情


  1.jsp中代码
  <form  id="uploadForm" method="post" action ="${ctx}/trainingSchedule/upFile.do" enctype ="multipart/form-data" target='uploadframe' >
            <input type="file" name="file1" id="fileName" class="mini-htmlfile"  limitType="*.xls;*.xlsx">
            <button  style="margin-left: 30px;" class="mini-button" iconCls="icon-upload" onclick="onUpload()">上传</button>
            <br>
            <br>
            <a href="${ctx}/static/exceltemplate/TrainingSchedule.xls">点击此处进行模板文件下载</a>
            <small style="margin-left: 50px;">备注:文件大小请控制在1M以内,文件支持为.xls格式数据</small>
            
    </form>
  2js中代码:
  function onUpload(){
 var file=mini.get("fileName").getValue();
 if(file==""||file==null){
      mini.alert("请选择要上传的文件!");
      return false; 
 }else{
     $("#uploadForm").submit();
 }
}


  3.controller中代码

    @RequestMapping("/upFile.do")
    @ResponseBody
    public ModelAndView Upload(HttpServletRequest request, HttpServletResponse response) {
        logger.info("===============批量上传业务处理开始=================");
        ResultDTO resultDTO = new ResultDTO();
        // 封转返回页面和数据
        ModelAndView modelAndView = new ModelAndView();
        // 创建一个通用的多部分解析器.
        CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(
                request.getSession().getServletContext());
        // 设置编码
        commonsMultipartResolver.setDefaultEncoding("gbk");

        // 判断 request 是否有文件上传,即多部分请求...
        if (commonsMultipartResolver.isMultipart(request)) {
            // 转换成多部分request
            MultipartHttpServletRequest multipartRequest = commonsMultipartResolver.resolveMultipart(request);

            // file 是指 文件上传标签的 name=值
            // 根据 name 获取上传的文件...
            MultipartFile file = multipartRequest.getFile("file1");
            String fileName = null;
            InputStream ins = null;
  try {
                fileName = file.getOriginalFilename();
                String fileExtends = fileName.split("\\.")[fileName.split("\\.").length - 1];
                if (!"xls".equals(fileExtends)) {
                    logger.error("必须上传  .xls 格式的Excel文件");
                    throw new BusinessException("必须上传  .xls 格式的Excel文件");
                }
                ins = file.getInputStream();
                String flag = trainingScheduleService.upload(ins, fileName);
                modelAndView.addObject("text", flag);
                modelAndView.setViewName("/schedule/scheduleError");
            } catch (BusinessException e) {
                modelAndView.addObject("text", e.getMessage());
                modelAndView.setViewName("/schedule/scheduleError");
                logger.error(e.getMessage());
            } catch (IOException e) {
                modelAndView.addObject("text", "处理文件失败");
                modelAndView.setViewName("/schedule/scheduleError");
                e.printStackTrace();
            } catch (Exception e) {
                modelAndView.addObject("text", "处理文件失败");
                modelAndView.setViewName("/schedule/scheduleError");
                e.printStackTrace();
            } finally {
                if (ins != null) {
                    try {
                        ins.close();
                    } catch (IOException e) {
                    logger.error(e.getMessage());
                    }
                }
            }
        }
        logger.info("================批量上传业务处理结束==============");
        return modelAndView;

    }
 

 

4.ServiceImpl中代码

public String upload(InputStream ins, String fileName) throws Exception {
        InputStream sbs = null;
        Workbook book = null;
        // String batchNo = null;

        try {
            String userId = SessionUtil.getUser().getUserId();
            // String userId =
            // manageUserService.getCurrentUserInfo().getUserId();
            logger.info("当前操作用户为:" + userId);
            byte[] b = null;
            try {
                b = toByteArray(ins);
            } catch (Exception e) {
                e.printStackTrace();
            } // 把流转换为数组

            logger.info("Excel文件已经保存到本地磁盘中");

            // batchNo = "B" + DateUtil.getCurrentDate("yyyyMMddHHmmsssss");

            // 保存文件
            saveFile(b, fileName);

            TrainingSchedule trainingSchedule = new TrainingSchedule();
            // trainingSchedule.setTransNo(batchNo);
            // trainingSchedule.setFileName(fileName);
            trainingSchedule.setCreateUser(userId);
            trainingSchedule.setCreateDate(DateUtil.getCurrentDateTime());

            sbs = new ByteArrayInputStream(b);
            try {
                book = Workbook.getWorkbook(sbs);
            } catch (BiffException e) {
                e.printStackTrace();
            }
  // 打开文件
            Sheet sheet = book.getSheet(0);

            for (int i = 1; i < sheet.getRows(); i++) {
                // 从Excel中取出信息
                String serialNumber = sheet.getCell(0, i).getContents().trim(); // 编号
                if (serialNumber == null || "".equals(serialNumber.trim())) {
                    throw new BusinessException("请确认上传文件与模板Excel文件格式一致!");
                }
                String annual = sheet.getCell(1, i).getContents().trim();
                String manage_com = sheet.getCell(2, i).getContents().trim();
                String class_type = sheet.getCell(3, i).getContents().trim();
                String annual_target = sheet.getCell(4, i).getContents().trim();

                // 上传重复的文件,先查询是否有这个文件,有的话就会将之前的文件进行覆盖,将之前的数据状态改为“无效”
                TrainingScheduleExample example = new TrainingScheduleExample();
                TrainingScheduleExample.Criteria criteria = example.createCriteria();
                criteria.andAnnualEqualTo(annual).andManageComEqualTo(manage_com).andClassTypeEqualTo(class_type)
                        .andScheduleStateEqualTo("1");

                List<TrainingSchedule> list = trainingScheduleMapper.selectByExample(example);
                if (list != null) {
                    for (int j = 0; j < list.size(); j++) {
                        TrainingSchedule trainingSchedule1 = list.get(j);
                        trainingSchedule1.setScheduleState("0");
                        trainingScheduleMapper.updateByPrimaryKey(trainingSchedule1);
                    }
                }
  trainingSchedule.setAnnual(annual);
                trainingSchedule.setManageCom(manage_com);
                trainingSchedule.setClassType(class_type);
                trainingSchedule.setAnnualTarget(annual_target);
                trainingSchedule.setCreateUser(userId);
                trainingSchedule.setCreateDate(DateUtil.getCurrentDateTime());
                trainingSchedule.setScheduleState("1"); // 初始值默认为有效;

                // 对manage_com与class_type两个字段进行数据校验
                verifyData(trainingSchedule, serialNumber) ;
                // 数据校验通过后才可以保存明细和保存数据库还有本地磁盘

             trainingScheduleMapper.insert(trainingSchedule);

                logger.info("Excel内容明细已经保存到数据库中");
            }
            // trainingScheduleMapper.insert(anhuiSelfcard);
        } catch (IOException e) {
  } catch (BusinessException e) {
            throw new BusinessException(e.getMessage());
        } finally {
            try {
                sbs.close();
            } catch (IOException e) {
                logger.info("文件流关闭异常!");
                e.printStackTrace();
            }
            try {
                book.close();
            } catch (Exception e) {
                e.printStackTrace();
                throw new BusinessException("批量上传文件解析失败!");
            }
        }

        return "上传成功!";
    }


  数据校验代码
  private void verifyData(TrainingSchedule trainingSchedule, String serialNumber) {
        logger.info("********************数据合法性校验,接收参数:" + trainingSchedule);
        String manageCom = trainingSchedule.getManageCom();
        String classType = trainingSchedule.getClassType();

        DefCodeInfoExample example = new DefCodeInfoExample();
        DefCodeInfoExample.Criteria criteria = example.createCriteria();
        criteria.andCodeEqualTo(classType).andCodeTypeEqualTo("class_type");

        List<DefCodeInfo> list = defCodeInfoMapper.selectByExample(example);
    
        if (list.size() == 0) {
            throw new BusinessException("类型为" + classType + " 的数据不存在!上传失败!");
        } else {

            ManagecomInfoExample example1 = new ManagecomInfoExample();
            ManagecomInfoExample.Criteria criteria1 = example1.createCriteria();
            criteria1.andManageComEqualTo(manageCom);

            List<ManagecomInfo> list1 = managecomInfoMapper.selectByExample(example1);
            if (list1.size() == 0) {

           throw new BusinessException("机构为" + manageCom + " 的机构不存在!上传失败!");
            }
        }

    }
}
 

poi上传Excel文件批量添加数据 Excel文件上传批量添加数据 poi使用Excel模板下载数据 :https://blog.youkuaiyun.com/kangshifu007/article/details/103174664 步骤 : 1.添加上传需要的依赖 2.在对应的实体类中添加构造方法(与普通构造稍有不同) 3.在controller层编写解析上传Excel文件的代码 4.在service层调用之前编写代码(我... 阅读详情

相关推荐

Vue前端上传EXCEL文件,后端(springBoot+MyBatis+MySQL)解析EXCEL并批量插入/更新数据库

文章目录Vue前端后端controller层service层:如何解析Excel文件MyBatis:实现批量插入在mysql中设置唯一索引Unique Index Vue前端 前端主要用了element-ui的upload组件。 <el-upload class="filter-item" name="excelFile" :act...

somnr3的博客 8025

对Excel导入功能, 前端解析及后端解析成list

html部分(使用miui,如普通html的话input标签加上type="file"使用) 首先引入js文件 <script type="text/javascript" src="${pageContext.servletContext.contextPath}/jslib/xlsx.full.min.js"></script> <tr id="wj" st...

qq_37528703的博客 1031

上传Excel文件批量保存到数据库

选择Excel文件,批量保存到数据表中,上传时能通过轮询方式显示进度。系统自动产生下载模板文件,同时支持中文名称下载和调整列宽等功能。

zbguolei的专栏 673

springboot里使用websocket实现文件上传并且显示进度

首先,我们清晰一下思路 1)先实现文件上传,我们应该清楚,文件上传和进度走的是两条路线,即异步; 2)再使用文件上传解析器去获取文件进度信息,这个信息是保存在一个session域里的,会被实时刷新; 3)websocket定时遍历,实现点对点发送上传进度信息; 很简单,就这三步 接下来开始实现 所需的maven依赖 <!--文件上传--> &l...

flykoala 6591

上传压缩文件并解压( 包括excel 和 图片文件) 中文日文不乱码 批量上传S3

上传压缩文件包括( excel 和 图片文件) 1.由页面上传压缩文件 test.zip aaa.xlsx images a.png b.png

赫兹焦耳的博客 1091

普元EOS:文件上传单个文件或多选文件上传

前言 因为普元里面nui其实就是搞得miniui就先找了找miniui的api,看到了FileUpload,但是FileUpload文件上传控件,基于FLASH的swfupload实现,能实现无刷新上传文件功能,但是基于flash就只能否了,最终选择了HtmlFile文件上传控件。 实现 先讲单文件 jsp部分: 官方代码里的简单介绍 http://www.miniui.com/docs/api/index.html#ui=htmlfile <input class="mini-h

马句 1276

表单中一次上传多个附件

"附件上传"组件需要勾选"允许多选"。上传附件时,选中需要上传的多个文件右键复制或Ctrl+C,Ctrl+V粘贴进行上传。(目前只支持使用Ctrl+V的方式一次性上传多个文件。"文档创建"订单管理"表单。"订单附件"字段组件选择"附件上传",勾选"允许多选"。"展示模式"选择"表格信息"。“订单管理”表单中需要一次上传多个附件,本文以该场景为例讲解表单中一次上传多个附件的实现。新增"订单管理"数据,点击"附件上传",复制需要上传的文件,Ctrl+V粘贴进行上传。

py_doc的博客 919

Sciter教程_00_创建HelloWorld工程

本教程记录Sciter工程的创建和编译运行的过程。

qq_36707072的博客 2278

html 上传文件类型限制

function checkFileExtension(file) { var validExtensions = new Array(".xlsx", ".xls"); var fileExtension = file.value; fileExtension = fileExtension.substring(fileExtension.lastIndexO

1127

frp内网穿透(socks隧道)

在实验过程中还是遇到了挺多的问题,但好在大多都解决了。不过还是遗留了一些不懂的问题,等以后再慢慢研究了。最后,以上仅为个人的拙见,如何有不对的地方,欢迎各位师傅指正与补充,有兴趣的师傅可以一起交流学习。

2301_76227305的博客 1万+

SIMetrix教程-001.SIMetrix软件简介与安装

  由于某些原因需要用到SIMetrix仿真软件,然而网上的资料并不是特别多,故在此记录一下这款仿真软件的学习过程,也给有需要的人提供一些参考,免走弯路。如果使用过Pspice或者LTspice软件,学习SIMetrix会很容易入门,仿真软件都是大同小异的,会一样后都可以快速入门其他软件。   SIMetrix是一款以SPICE模型为基础的仿真软件,集成了SIMetrix和SIMPLIS两款内核,为工程师提供了可靠的、易于使用的、并完美结合了速度与精度的电路仿真方式。官方的话不多说,和LTspice一样,优

gaoyong_wang的博客 2万+

利用EXCEL文件批量上传

https://blog.youkuaiyun.com/femalcoder/article/details/55657030 ajax实现文件上传 https://blog.youkuaiyun.com/xxkalychen/article/details/77844542 @RequestMapping({ "/batchAdd" }) public R downBatchAd...

airwolf3366的博客 259

自建智能算力中心与第三方算力租赁的深度分析

自建智算中心和第三方算力租赁的主要区别如下:对比维度自建算力中心第三方算力租赁初期成本数千万至数亿元硬件采购+机房基建零硬件投入,按需付费(如1元/卡时)部署速度6-12个月(采购、部署、调试)即时开通,分钟级资源调度运维难度需专业IT团队,承担断电、故障等风险服务商全托管,SLA保障99.95%可用性弹性扩展扩容需重新采购硬件,周期长、成本高支持秒级弹性伸缩,应对流量峰值技术迭代硬件更新周期长,易被淘汰自动升级。

2501_90999758的博客 2361

Excel文件一键上传并解析完成数据批量导入数据库

原来做文件上传的时候,都是有一个输入框,点击上传按钮,先浏览文件,选择文件后,把文件的路径保存到form表单中,最后通过form表单提交到服务端。这样的界面不是很美观。为了用户有更好地体验(UE),现在的大多数系统都是采用一键文件上传,用户点击上传按钮,选择要上传的文件,确定之后,文件就直接上传了,不需要提供额外的form表单,而且可以实现页面文件上传无刷新。 文件上传和一键文件上传的原理 文件上...

小机灵鬼 8445

JESD204B系统设计实战:如何用SYSREF信号搞定多设备时钟同步(附时序图详解)

本文深入探讨了JESD204B系统中SYSREF信号在多设备时钟同步中的关键作用与实现技巧。通过详细分析SYSREF信号的生成、PCB布局和时序调整,提供了一套完整的解决方案,帮助工程师解决高速数据转换器与FPGA协同工作中的时钟同步问题。文章还包含时序图详解和实测调试技巧,助力提升系统性能。

weixin_29313239的博客 457

TwinCAT3实战:从零搭建倍福PLC的Modbus-TCP Server

本文详细介绍了如何使用TwinCAT3从零搭建倍福PLC的Modbus-TCP Server,包括环境准备、工程配置、参数设置、客户端连接测试及常见问题排查。通过实战步骤和实用技巧,帮助工程师快速掌握倍福PLC与Modbus-TCP的通信实现,提升工业自动化项目的开发效率。

weixin_30797199的博客 174

vue3项目,批量上传excel文件,然后读取excel中内容

上传区域:使用 组件创建了一个文件上传区域,允许用户选择文件,但限制了最大文件数量,并指定了接受的文件类型为 格式的 Excel 文件。 函数定义: 函数接收一个参数 ,这个参数代表要读取的 Excel 文件。返回 Promise:函数返回一个新的 Promise 对象,这使得函数可以异步执行并处理完成后的结果。创建 FileReader 对象:创建一个 对象,用于读取文件内容。读取文件:使用 方法读取文件,这会将文件内容作为二进制字符串读入。处理文件加载事件:当文件加载完成时,触发 事件

jyl4855的博客 1308

荒岛逃生游戏

正负表示逃生方向(正表示向右逃生,负表示向左逃生),绝对值表示战斗力,越左边的数字表示里左边港口越近,逃生方向相同的人永远不会发生决斗。- 如果左逃生者的战斗力大于右逃生者,则左逃生者获胜,减少其战斗力,并将右逃生者出栈。- 处理完所有输入后,统计仍在右逃生者栈和左逃生者栈中的战斗力,即可得到成功逃生的人数。- 如果左逃生者的战斗力小于右逃生者,则右逃生者获胜,减少其战斗力,左逃生者出局。- 向左逃生:从右逃生者栈中取出元素,与当前逃生者进行决斗。- 继续进行决斗,直到没有右逃生者或左逃生者的战斗力用尽。

面试高手的博客 2105

JAVA批量上传下载Excel_SpringBoot实现Excel文件批量上传导入数据库

Spring boot + Spring data jpa + Thymeleaf批量插入 + POI读取 + 文件上传pom.xml:org.apache.poipoi3.17org.apache.poipoi-ooxml3.17upload.html:文件如果自己的项目中使用了Spring security,页面提交文件之后,会出现403的错误,最快的解决办法,如下:http.csrf()....

weixin_39773215的博客 327

【YOLOv11改进- 主干网络】YOLOv11+WTConv(ECCV2024): 基于YOLOv11的主干网络改进,大感受野的小波卷积

论文提出了WTConv,这是一个使用级联小波分解的层,并执行一组小卷积核的卷积,每个卷积专注于输入的不同频率带,并具有越来越大的感受野。这个过程能够在输入中对低频信息给予更多重视,同时仅增加少量可训练参数。实际上,对于一个  的感受野,可训练参数数量只随着  的增长而呈对数增长。而WTConv与常规方法的参数平方增长形成对比,能够获得有效的卷积神经网络(CNN),其有效感受野(ERF)大小前所未有。

qq_41304809的博客 1401

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

批量新增_(struts2文件上传、下载,jxl读取Excel等)

项目中的应用,有一个“批量新增”的按钮,点击时包括的处理:Excel文档上传,读取Excel数据等。Excel上传部分,用Struts2文件上传实现,关键代码如下:package com.eshore.itsm.common;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;

Bob1228的专栏 1178

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上传excel文件实现批量导入数据及导出数据为excel文件

csdn第一篇博客

aishenla的博客 5785

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

批量添加:vue+easyexcel 上传excel文件解析为Java对象并保存到数据库

类,我们需要根据自身情况去具体的设置,如果说excel文件中的数据就是刚好能符合后端接收数据的对象的属性,那么我们无需再定义一个类去接收。如果excel文件中只是包含了个别字段,那么我们最好再去定义一个新的类先将数据接收并保存,再将数据copy给指定的类的集合。通过上面的代码我们就能实现前端传输Excel文件到后端进行解析的操作了,最终得到一个集合,再进一步对集合中数据进行相应的操作即可。后端:接收到前端传输的文件后,将其读取到内存中,再通过EasyExcel对其进行解析。Controller层代码。

weixin_45890113的博客 1486

SpringBoot-Excel文件批量上传导入数据库

Spring boot + Spring data jpa + Thymeleaf 批量插入 + POI读取 + 文件上传 pom.xml: &lt;!-- https://mvnrepository.com/artifact/org.apache.poi/poi --&gt; &lt;dependency&gt; &lt;groupId&gt;org.apache.poi&lt;...

孟孟的博客 6261

文件信息批量导入数据库(Struts2实现文件上传,POI实现Excel文件读取并写入数据库) .

如题:文件信息的批量导入...... 项目中经常会遇到客户的一些单表信息的数据批量导入,也就是提供定制Excel表,再把Excel表中的数据提取到数据库的操作,其实实现起来很简单。以下是小菜鸟我的实现思路:   1、JSP页面+Struts2实现文件上传,把定制Excel上传到服务器指定目录下,以供读取; 2、POI读取Excel表格,把数据封装为持久化实体List 3、批量导入数据库

xiaokuang513204的专栏 5487

spring上传Excel文件批量导入数据

【代码】spring上传Excel文件批量导入数据。

qq_46119503的博客 301
上一篇: miniUI只显示年份跟月份
下一篇: 如何在js中对上传的文件类型进行校验
不修电脑的程序员
博客等级 码龄9年 47粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值