POI处理Excel

<!-- poi处理excel --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.9</version></dependency><!-- 使用 JSONObject net.sf.json.JSON --><dependency><groupId>net.sf.json-lib</groupId><artifactId>json-lib</artifactId><version>2.4</version><classifier>jdk15</classifier></dependency>

下面是我们的数据库

前端使用Layui

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head><meta charset="UTF-8"><title>成绩录入</title><meta name="renderer" content="webkit"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta http-equiv="Access-Control-Allow-Origin" content="*"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"><meta name="apple-mobile-web-app-status-bar-style" content="black"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="format-detection" content="telephone=no"><link rel="icon" href="/resources/favicon.ico"><link rel="stylesheet" href="resources/layui/css/layui.css" th:href="@{/resources/layui/css/layui.css}"media="all"/><link rel="stylesheet" href="resources/css/public.css" th:href="@{/resources/css/public.css}" media="all"/><link rel="stylesheet" th:href="@{/resources/layui_ext/dtree/dtree.css}" media="all"/><link rel="stylesheet" th:href="@{/resources/layui_ext/dtree/font/dtreefont.css}" media="all"/>
</head>
<style>.uploadcss{text-align: center;margin-top: 15px;}.centerupload{margin: 0 auto;}
</style>
<body class="childrenBody">
<!--查询条件-->
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 15px;"><legend>成绩导入</legend>
</fieldset>
<div style="margin-bottom: 20px"><form action="" method="post" id="searchFrm" lay-filter="searchFrm" class="layui-form"><div class="layui-form-item"><div class="layui-inline"><label class="layui-form-label">学生姓名</label><div class="layui-input-inline"><input type="text" name="username" id="username" class="layui-input input-radius"placeholder="请输入学生姓名"></div></div><div class="layui-inline"><label class="layui-form-label">考试名称</label><div class="layui-input-inline"><input type="text" name="testname" id="testname" class="layui-input input-radius" placeholder="请输入考试名称"></div></div><div class="layui-inline"><label class="layui-form-label">班级名称</label><div class="layui-input-inline"><input type="hidden" name="deptid" id="search_deptid"><ul id="search_deptTree" class="dtree" data-id="0"></ul></div></div></div><div class="layui-form-item"><div class="layui-input-block" style="text-align: center;padding-right: 15%;"><button type="button" class="layui-btn layui-btn-sm layui-btn-radius" lay-submit="" lay-filter="doSearch"><iclass="layui-icon layui-icon-search layui-icon-normal"></i>查询</button><button type="reset" class="layui-btn layui-btn-sm layui-btn-radius layui-btn-warm"><iclass="layui-icon layui-icon-refresh"></i><span>重置</span></button></div></div></form></div><!--数据表格-->
<div><table class="layui-hide" id="scoreTable" lay-filter="scoreTable"></table><div id="scoreToolBar" style="display: none"><button type="button" lay-event="batchDelete"  class="layui-btn layui-btn-sm layui-btn-danger layui-btn-radius"><i class="layui-icon layui-icon-delete"></i>批量删除</button><button type="button" lay-event="addBatch"  class="layui-btn layui-btn-sm layui-btn-radius"><i class="layui-icon layui-icon-upload-drag"></i>导入Excel</button><button type="button" lay-event="excelDown"  class="layui-btn layui-btn-sm  layui-btn-warm layui-btn-radius"><a th:href="@{/resources/excel/exportscore.xls}"><i class="layui-icon layui-icon-download-circle"></i>模板下载</a></button></div><div id="noticeRowBar" style="display: none;"><button type="button" lay-event="delete"  class="layui-btn layui-btn-sm layui-btn-danger layui-btn-radius"><iclass="layui-icon layui-icon-delete"></i>删除</button></div>
</div><!--添加Excel导入成绩-->
<div id="batchScoreExcel"  style="display: none;padding: 10px;padding-right: 5%"><form class="layui-form layui-row" method="post"><input type="hidden" name="excelpath" id="excelpath"><div class="centerupload"><div class="layui-form-item"><div class="uploadcss"><button type="button" class="layui-btn" id="excelsave"><i class="layui-icon"></i><label id="uptext">上传Excel</label></button></div></div><div class="layui-form-item"><div class="uploadcss"><button class="layui-btn" lay-submit="" lay-filter="exportexcel" id="exportnow">立即导入</button><!--<button type="reset" class="layui-btn layui-btn-primary">重置</button>--></div></div></div></form>
</div><script type="text/javascript" src="/resources/layui/layui.js"></script><script type="text/javascript">layui.extend({ dtree: '/resources/layui_ext/dtree/dtree'}).use(['jquery', 'form', 'layer', 'laydate', 'table','layedit','upload', 'dtree'], function () {var $ = layui.jquery;var form = layui.form;var layer = layui.layer;var laydate = layui.laydate;var table = layui.table;var layedit = layui.layedit;var upload = layui.upload;var dtree = layui.dtree;//初始化时间选择器laydate.render({elem: "#startTime",type: "datetime"});laydate.render({elem: "#endTime",type: "datetime"});//初始化查询条件的下拉树var selectTree = dtree.renderSelect({elem: "#search_deptTree",width: "100%", // 可以在这里指定树的宽度来填满divdataStyle: "layuiStyle", //使用layui风格的数据格式dataFormat: "list",     //配置data的风格为listresponse: {message: "msg", statusCode: 0},  //修改response中返回数据的定义url: "/dept/loadDeptManagerLeftTreeJson" // 使用url加载(可与data加载同时存在)});//监听点击的方法dtree.on("node(search_deptTree)", function (obj) {$("#search_deptid").val(obj.param.nodeId);console.log(obj.param.nodeId);});//初始化表格 加载数据var tableIns = table.render({elem: "#scoreTable",title: "公告数据表格",url: "/bus/score/loadallscore",toolbar: "#scoreToolBar",page: true,height: "full-190",cols: [ [{type: 'checkbox', fixed: 'left'},{field: 'id', title: 'ID', align: 'center'},{field: 'testname', title: '考试名', align: 'center'},{field: 'deptname', title: '班级名', align: 'center'},{field: 'userid', title: '学号', align: 'center'},{field: 'username', title: '姓名', align: 'center'},{field: 'chinesescore', title: '语文成绩', align: 'center'},{field: 'mathscore', title: '数学成绩', align: 'center'},{field: 'englishscore', title: '英语成绩', align: 'center'},{field: 'totlescore', title: '总成绩', align: 'center'},{field: 'teacherwords', title: '教师寄语', align: 'center'},{fixed: 'right', title: '操作', toolbar: '#noticeRowBar', align: 'center'}] ],done:function (data, curr, count) {/*if(data.count==0&&data.data.length==0){tableIns.reload({page:{curr:1}})}else*//* console.log(data);console.log(curr);  //1console.log(count); //0*/if(data.data.length==0&&curr!=1){   //不是第一页时,如果当前返回的数据为0那么就返回上一页tableIns.reload({page:{curr:curr-1}});}/*else if (data.data.length==0 && curr==1){    //当前是第一页时,如果当前返回的数据为0并且当前为第一页  给一个空的查询条件,并给curr赋初值为1tableIns.reload({where: "",page:{curr:1}});}*/}});//上传文档接口var uploadInst = upload.render({elem: '#excelsave' //绑定元素,url: '/user/excelupload' //上传接口,accept:'file'//允许的文件类型,field:'mf',done: function(res){var path=res.path;var excelpath=$("#excelpath");var excelsave=$("#excelsave");excelsave.addClass("layui-btn-disabled");$("#uptext").html("已接收");excelpath.val(path);console.log(excelpath.val());layer.msg("文件已经接收成功!请点击:\"立即导入\"快速生成用户数据");},error: function(){layer.msg("上传出错!")}});//提交转换excelform.on("submit(exportexcel)",function(data){var excelpath=$("#excelpath");if(excelpath.val()==''){layer.msg("请上传Excel表格");}else {var index = layer.msg('数据转换中,请稍候',{icon: 16,time:false,shade:0.8});$.post("/bus/score/exceltoScore", data.field, function (res) {layer.msg(res.msg);});var excelsave=$("#excelsave");excelsave.removeClass("layui-btn-disabled");$("#uptext").html("上传Excel");layer.close(index);layer.close(mainIndex);setTimeout(function(){tableIns.reload('userTable',{page: {curr: 1}});},500);}return false; //阻止表单跳转。如果需要表单跳转,去掉这段即可。});//初始化富文本编译器var editIndex = layedit.build('content');//监控模糊查询按钮事件form.on("submit(doSearch)", function (data) {tableIns.reload({where: data.field,page: {curr: 1}});return false;});//监控工具条事件table.on("toolbar(scoreTable)", function (obj) {switch (obj.event) {case 'batchDelete':batchDelete();break;case 'addBatch':addBatchLayer();break;};});var mainIndex;//打开导入文件弹出层function addBatchLayer() {mainIndex=layer.open({type: 1,content: $("#batchScoreExcel"),area: ['300px', '200px'],title: 'Excel批量导入学生成绩',success:function () {var excelpath=$("#excelpath");excelpath.val("");}});}//监控行工具条事件table.on("tool(scoreTable)",function (obj) {//获取当前行数据var data = obj.data;switch (obj.event){case 'delete':deleteInfo(data);break;case 'update':updateNotice(data);break;case 'show':showNotice(data);break;};});//删除function deleteInfo(data) {layer.confirm('你确定要删除【'+data.username+'】这个学生成绩吗?',{icon: 3,title:'提示'},function (index) {$.post("/bus/score/delectscore",{id:data.id},function (res) {if (res.code==200){tableIns.reload({//删除成功加载表格时,要重置查询条件where:"",});}layer.msg(res.msg);});layer.close(index);});}//批量删除function batchDelete() {//得到选中行var checkStatus = table.checkStatus('scoreTable');var dataLength = checkStatus.data.length;if (dataLength>0){layer.confirm('你确定要删除这些成绩吗?',{icon: 3,title: '提示'},function (index) {//获取选中行数据var data = checkStatus.data;var ids = "";$.each(data,function (index, item) {if (index==0){ids+="ids="+item.id;}else {ids+="&ids="+item.id;}});$.post("/bus/score/batchdelectscore",ids,function (res) {if (res.code==200){//重新刷新表格tableIns.reload({where:"",});}layer.msg(res.msg);});layer.close(index);});}else {layer.msg("请选中操作行")}}var mainIndex;var url;});</script></body>
</html>

然后我们使用Mybatisplus对Bus_score自动生成一些类

主要的业务逻辑代码

package com.bs.bus.common;import com.bs.bus.entity.Score;
import com.bs.sys.common.excel.ExcelUtil;
import com.bs.sys.service.IDeptService;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;@Component
public class ScoreExcelParse {@Autowiredprivate IDeptService deptService;//Autowired注解,spring不推荐使用静态方法,在非controller中使用的话需要在类加载之前初始化autowired服务,再进行使用public static ScoreExcelParse scoreExcelParse;@PostConstructpublic void init() {scoreExcelParse = this;scoreExcelParse.deptService=this.deptService;}public static List<Score> ExceltoScore(File userUploadFile){List<Score> list=new ArrayList<>();Score score=null;try {POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(userUploadFile));HSSFWorkbook wb = new HSSFWorkbook(fs);//获取第一个sheet页HSSFSheet sheet = wb.getSheetAt(0);if(sheet!=null){for(int rowNum =1;rowNum<=sheet.getLastRowNum();rowNum++){HSSFRow row = sheet.getRow(rowNum);if(row==null){continue;}score=new Score();//将单元格里每行数据存入ScoreVo对象中score.setDeptname(ExcelUtil.formatCell(row.getCell(0)).split("\\.")[0]);score.setTestname(ExcelUtil.formatCell(row.getCell(1)));score.setUserid(Integer.parseInt(ExcelUtil.formatCell(row.getCell(2)).split("\\.")[0]));score.setUsername(ExcelUtil.formatCell(row.getCell(3)).split("\\.")[0]);score.setChinesescore(Integer.parseInt(ExcelUtil.formatCell(row.getCell(4)).split("\\.")[0]));score.setMathscore(Integer.parseInt(ExcelUtil.formatCell(row.getCell(5)).split("\\.")[0]));score.setEnglishscore(Integer.parseInt(ExcelUtil.formatCell(row.getCell(6)).split("\\.")[0]));score.setTeacherwords(ExcelUtil.formatCell(row.getCell(7)));score.setTotlescore(score.getChinesescore()+score.getEnglishscore()+score.getMathscore());score.setTestid(Md5Util.generateHash(score.getTestname()).substring(0,6));score.setDeptid(scoreExcelParse.deptService.getDeptByName(score.getDeptname()).getId());list.add(score);}}}  catch (IOException e) {e.printStackTrace();}return list;}
}

控制器代码

package com.bs.bus.controller;import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bs.bus.common.ScoreExcelParse;
import com.bs.bus.entity.Score;
import com.bs.bus.service.IScoreService;
import com.bs.bus.vo.ScoreVo;
import com.bs.sys.common.*;
import com.bs.sys.entity.Dept;
import com.bs.sys.entity.Notice;
import com.bs.sys.entity.Role;
import com.bs.sys.entity.User;
import com.bs.sys.service.IDeptService;
import com.bs.sys.vo.NoticeVo;
import com.bs.sys.vo.UsersExcelVo;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.io.File;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;/*** <p>*  前端控制器* </p>** @author lzb* @since 2020-04-15*/
@RestController
@RequestMapping("/bus/score")
public class ScoreController {@Autowiredprivate IScoreService scoreService;@Autowiredprivate IDeptService deptService;@RequestMapping("exceltoScore")public ResultObj excelToScore(String excelpath){try {List<Score> list= new ScoreExcelParse().ExceltoScore((new File(AppFileUtils.UPLOAD_PATH+"/"+excelpath)));for(Score score:list){scoreService.save(score);}return ResultObj.ADD_SUCCESS;} catch (Exception e) {e.printStackTrace();return ResultObj.ADD_ERROR;}}@RequestMapping("loadallscore")public DataGridView loadAllScore(ScoreVo scoreVo){//从缓存获取登录用户User user = (User) WebUtils.getSession().getAttribute("user");//写不同登录用户角色能查看的数据IPage<Score> page = new Page<Score>(scoreVo.getPage(),scoreVo.getLimit());QueryWrapper<Score> queryWrapper = new QueryWrapper<Score>();//进行模糊查询queryWrapper.like(StringUtils.isNotBlank(scoreVo.getTestname()),"testname",scoreVo.getTestname());queryWrapper.like(StringUtils.isNotBlank(scoreVo.getUsername()),"username",scoreVo.getUsername());if(scoreVo.getDeptid()==null||scoreVo.getDeptid()==1){queryWrapper.like("deptid","");}else {queryWrapper.like(StringUtils.isNotBlank(deptService.getById(scoreVo.getDeptid()).getName()),"deptname",deptService.getById(scoreVo.getDeptid()).getName());}queryWrapper.orderByAsc(("userid"));scoreService.page(page,queryWrapper);List<Score> list=page.getRecords();return new DataGridView(page.getTotal(),page.getRecords());}@RequestMapping("delectscore")public ResultObj delectScore(ScoreVo scoreVo){try {scoreService.removeById(scoreVo);return ResultObj.DELETE_SUCCESS;} catch (Exception e) {e.printStackTrace();return ResultObj.DELETE_ERROR;}}/*** 批量删除公告* @param scoreVo* @return*/@RequestMapping("batchdelectscore")public ResultObj batchDeleteScore(ScoreVo scoreVo){try {Collection<Serializable> idList = new ArrayList<>();for (Integer id : scoreVo.getIds()) {idList.add(id);}scoreService.removeByIds(idList);return ResultObj.DELETE_SUCCESS;} catch (Exception e) {e.printStackTrace();return ResultObj.DELETE_ERROR;}}
}

最后的页面效果

整个项目源码请参考https://github.com/yorkmass/Yark-AdminMS

Springboot Excel批量导入数据相关推荐

  1. 【转帖】Java实现Excel批量导入数据

    这篇文章主要为大家详细介绍了Java实现Excel批量导入数据,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 Excel的批量导入是很常见的功能,这里采用Jxl实现,数 ...

  2. SpringMVC框架通过Excel批量导入数据

    文章目录 SpringMVC框架通过Excel批量导入数据 1.导入需要的jar包 2.配置文件 3.创建Java对象类 4.解析Excel表格数据的工具类 5.前端请求 6.Controller处理 ...

  3. Spring Boot 实现excel 批量导入数据(模板下载 ->数据导入->导入失败表格下载)

    批量导入数据以用户为例[不贴数据库操作代码,都是简单的插入和查询操作自己写] 1 导入依赖 2 批量导入模板下载 3 批量导入数据 准备工作 实现代码 测试接口 4 下载导入失败表格 5 实体类 6 ...

  4. excel批量导入数据

    这个功能也是我以前项目中经常用到的,感觉很实用,必须拿来分享下: excel进行批量导入数据,结合struts2+ajax 导入的视图:batchAdd.ftl(视图无关紧要的,可以换成其他任何视图, ...

  5. java使用POI实现Excel批量导入数据。

    1.背景 项目中有使用easypoi,处理常规excel问题,但是现在有个需求,需要动态生成导出的报表字段.同时,根据导入的excel,增加数据信息.(有可能会出现,导入的报表是几天前下载的,不会最新 ...

  6. EXCEL批量导入数据MVC

    这里简单实现EXCEL的批量导入 直接看代码,里面有注释 前端页面实现 @{ ViewBag.Title = "批量添加数据"; //Layout = null; } href=& ...

  7. Java实现Excel批量导入数据

    Excel的批量导入是很常见的功能,这里采用 Jxl实现,数据量或样式要求较高可以采用 poi 框架环境:Spring + SpringMvc(注解实现) 首先导入依赖jar包 <depende ...

  8. 如何使用excel批量导入数据到数据库?看这一篇就够了!超详细

    应用场景 当我们遇到要批量新增数据库条数的时候 1.你可以写一个接口去用excel去导入,可以自动化,但是前提是你知道你要新增的表和流程才可以 2.可以用excel直接进行数据库导入 excel导入数 ...

  9. php 用excel 批量导入数据

    public function post(){if($this->request->isPost()){vendor("PHPExcel.PHPExcel");//导入 ...

最新文章

  1. ACM的java 傻瓜式教学
  2. 相机标定之4个坐标系之间的变换关系
  3. linux下装sqlserver安装包,【sqlServer】CentOS7.x 上Microsoft SQL Server for Linux安装和配置...
  4. python福利彩随机_看大神如何用Python分析福利彩票的秘密,百万大奖不是梦!
  5. unity怪物攻击玩家减血_怪物猎人发布15周年 — 回顾历代封面怪之三大传奇怪物...
  6. Ext JS 6开发实例(三) :主界面设计
  7. 澳大利亚通信软件服务公司 Whispir 完成1175万美元 A 轮融资
  8. mysql加begin报错,MySQL存储过程例子,不能在if else里面用begin end否则会报错Error Code:1064解决...
  9. wincc控件包下载_WinCC中使用控件.pdf
  10. 【书评】《IPD 华为研发之道》(著者:刘选鹏)
  11. Cosmos 是什么? 一文了解Cosmos的来龙去脉
  12. U盘为什么出现0字节?如何解决U盘0字节
  13. 最简洁影视后期制作(AE)教程之导出导入
  14. 人工智能行业每日必读(2020年1月14日)
  15. 【通刷】_晶晨S905L3A、S905L3AB芯片_安卓9.0_AI语音_完美线刷固件包
  16. java faces,用JavaServer Faces开发Web应用(3) (转)
  17. Jekyll+GitHub搭建个人博客
  18. 李建忠设计模式——享元模式
  19. 架也不吵了!谷歌大脑、DeepMind团结对抗OpenAI
  20. 【计量经济学】统计推断

热门文章

  1. samba服务器的搭建
  2. 【考研数据】一.2020年BJTU计算机学院考研录取数据分析
  3. 深度学习第一周 tensorflow实现mnist手写数字识别
  4. js 音频音乐播放封装函数代码
  5. ESP32 开发笔记(一) 开发板简介
  6. 大数据——21世纪的石油和钻石,怎么用?
  7. 端午宅家游戏:Cozy Grove for Mac(独特手绘生存冒险游戏)
  8. 服务器CPU占用过高和哪些因素有关呢
  9. 基于Java的网络兼职平台系统的设计与实现(论文+程序设计+数据库文件)
  10. matlab paillier加密_叶胜超:一分钟了解Paillier同态加密算法以及经典应用(118)...