工具类:
工具类中的内容可以根据自己的情况进行修改
package com.tphy.nursing.util; import com.tphy.nursing.exam.bean.TestList; import com.tphy.nursing.personinfo.bean.RYXX; import java.util.HashMap; import java.util.Map; /** * @author lbz * @version 1.0 * @date 2020/4/24 11:31 * @description: */ public class ExcelResult { public Map<String,Object> map=new HashMap<String, Object>(); public ExcelResult put(String str, Object obj){ this.map.put(str,obj); return this; } //上传成功信息 public static ExcelResult success(int row, int successNumber, TestList testList){ ExcelResult entity=new ExcelResult(); entity.map.put("statusCode",200); entity.map.put("message","响应成功"); entity.map.put("row",row); entity.map.put("successNumber","共"+successNumber+"条数据导入成功"); entity.map.put("testList",testList); return entity; } //上传失败信息 public static ExcelResult error(int row, int failNumber, TestList testList){ ExcelResult entity=new ExcelResult(); entity.map.put("statusCode",500); entity.map.put("message","响应失败"); entity.map.put("row",row); entity.map.put("failNumber","共"+failNumber+"条数据导入失败"); entity.map.put("testList",testList); return entity; } public static ExcelResult errorMessage(){ ExcelResult entity=new ExcelResult(); entity.map.put("statusCode",500); entity.map.put("message","响应失败"); return entity; } //上传内容有误 public static ExcelResult errorMessage(String errorMessage,int row, TestList testList){ ExcelResult entity=new ExcelResult(); entity.map.put("statusCode",500); entity.map.put("message","响应失败"); entity.map.put("errorMessage",errorMessage); entity.map.put("row",row); entity.map.put("testList",testList); return entity; } //上传成功信息(人员列表) public static ExcelResult successRylb(int row, int successNumber, RYXX ryxx){ ExcelResult entity=new ExcelResult(); entity.map.put("statusCode",200); entity.map.put("message","响应成功"); entity.map.put("row",row); entity.map.put("successNumber","共"+successNumber+"条数据导入成功"); entity.map.put("ryxx",ryxx); return entity; } //上传失败信息(人员列表) public static ExcelResult errorRylb(int row, int failNumber, RYXX ryxx){ ExcelResult entity=new ExcelResult(); entity.map.put("statusCode",500); entity.map.put("message","响应失败"); entity.map.put("row",row); entity.map.put("failNumber","共"+failNumber+"条数据导入失败"); entity.map.put("ryxx",ryxx); return entity; } //上传内容有误(人员列表) public static ExcelResult errorMessageRylb(String errorMessage,int row, RYXX ryxx){ ExcelResult entity=new ExcelResult(); entity.map.put("statusCode",500); entity.map.put("message","响应失败"); entity.map.put("errorMessage",errorMessage); entity.map.put("row",row); entity.map.put("ryxx",ryxx); return entity; } }
Controller类:
Excel2003版本(.xls)的和2007版本(.xlsx)的写法不同,具体在创建文档的方法不同
package com.tphy.nursing.exam.controller; import com.alibaba.fastjson.JSON; import com.tphy.nursing.common.bean.Data; import com.tphy.nursing.exam.bean.*; import com.tphy.nursing.exam.mapper.STKMMapper; import com.tphy.nursing.exam.mapper.STLXMapper; import com.tphy.nursing.exam.mapper.TestListMapper; import com.tphy.nursing.login.bean.Login; import com.tphy.nursing.util.*; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.*; import java.net.URLEncoder; import java.util.*; import java.io.File; import java.io.FileInputStream; import java.util.List; /** * @author :lqw * @date :Created in 2020/3/16 15:28 * @description:试题导入 * @modified By: * @version: 1 */ @Controller @RequestMapping("/excel") public class ExcelController { @Autowired private STLXMapper stlxMapper; @Autowired private STKMMapper stkmMapper; @Autowired private GetProcedure getProcedure; @Autowired private TestListMapper testListMapper; /** * create by: lbz * description: excel试题导入.xls * create time: 2020/3/16 15:29 * * @param : * @return * @return : null */ @RequestMapping(value = "/import_2003") @ResponseBody public ArrayList<ExcelResult> import_2003(@RequestParam("file") MultipartFile file, HttpServletRequest request, HttpServletResponse response) { HttpSession session = request.getSession(); Login info = (Login)session.getAttribute("info"); try { ArrayList<ExcelResult> excelResults = new ArrayList<>(); // @RequestParam("file") MultipartFile file 是用来接收前端传递过来的文件 // 1.创建workbook对象,读取整个文档 InputStream inputStream = file.getInputStream(); POIFSFileSystem poifsFileSystem = new POIFSFileSystem(inputStream); HSSFWorkbook wb = new HSSFWorkbook(poifsFileSystem); // 2.读取页脚sheet HSSFSheet sheetAt = wb.getSheetAt(0); // 3.循环读取某一行 HSSFSheet sheet = wb.getSheetAt(0); System.out.println("sheet对象:" + sheet); //获取最后一行的num,即总行数。此处从0开始计数 int maxRow = sheet.getLastRowNum(); System.out.println("总行数为:" + maxRow); List<TestList> testLists = new ArrayList<>(); int successNumber = 0; //成功条数 int failNumber = 0; //失败条数 int flag = 1; //标识符 //从第三行开始添加 for (int row = 2; row <= maxRow; row++) { flag = 1; //定义初始标识符,如果为1则excel内容无错,进行插入,如果为0则excel内容有误,将相应的错误信息存到工具类中返回 //获取最后单元格num,即总单元格数 ***注意:此处从1开始计数*** int maxRol = sheet.getRow(row).getLastCellNum(); System.out.println("总列数为:"+maxRol); System.out.println("--------第" + row + "行的数据如下--------"); TestList tl = new TestList(); tl.setCjsj(new Date()); tl.setStdm(getProcedure.getEightCode("nms_code_stdm_id")); tl.setTplj(null); tl.setSxh(Integer.valueOf(getProcedure.getEightCode("nms_code_stdm_sxh"))); tl.setXgsj(new Date()); tl.setCtr(info.getUsername()); for (int rol = 0; rol < maxRol; rol++){ if(rol==0){ String stmc = (sheet.getRow(row).getCell(rol)+"").equals("") ? " ":sheet.getRow(row).getCell(rol)+""; //判断试题名称是否为空 String pydm = (sheet.getRow(row).getCell(rol)+"").equals("") ? " ":sheet.getRow(row).getCell(rol)+""; //判断拼音代码是否为空 tl.setStmc(stmc); tl.setPydm(pydm); } if(rol ==1){ System.out.println("显示标志:"+sheet.getRow(row).getCell(rol)+""); //显示标志为空 if((sheet.getRow(row).getCell(rol)) == null){ excelResults.add( ExcelResult.errorMessage("显示标志为空",row,tl)); flag = 0; }else{ if((sheet.getRow(row).getCell(rol)+"").equals("1.0")){ //将1.0变为1插入数据库 tl.setXsbz("1"); } if((sheet.getRow(row).getCell(rol)+"").equals("0.0")){ //将0.0变为1插入数据库 tl.setXsbz("0"); } // tl.setXsbz(sheet.getRow(row).getCell(rol)+""); } } if(rol ==2){ STLXExample example = new STLXExample(); STLXExample.Criteria criteria = example.createCriteria(); criteria.andLxmcLike(sheet.getRow(row).getCell(rol)+""); List<STLX> stlxes = stlxMapper.selectByExample(example); System.out.println("stlxes:"+stlxes); if(stlxes.size() == 0){ excelResults.add( ExcelResult.errorMessage("试题类型有误",row,tl)); flag = 0; }else{ tl.setStlx(stlxes.get(0).getLxdm()); } } if(rol ==3){ System.out.println("试题题干:" + sheet.getRow(row).getCell(rol)); //试题题干为空 if((sheet.getRow(row).getCell(rol)+"").equals("") || (sheet.getRow(row).getCell(rol)) == null){ excelResults.add( ExcelResult.errorMessage("试题题干为空",row,tl)); flag = 0; }else{ tl.setSttg(sheet.getRow(row).getCell(rol)+""); } } if(rol ==4){ System.out.println("试题类型:" + tl.getStlx()); //单选和多选的试题答案只能是大写英文 if(tl.getStlx() == "" || tl.getStlx() == null){ flag = 0; }else if(tl.getStlx().equals("01") || tl.getStlx().equals("02")){ int length = (sheet.getRow(row).getCell(rol)+"").split(",").length; for(int i = 0; i < length; i ++){ //将试题答案替换为字符串并进行判断 if(!((sheet.getRow(row).getCell(rol)+"").replaceAll(",","").charAt(i) >= 'A' && (sheet.getRow(row).getCell(rol)+"").replaceAll(",","").charAt(i) <= 'Z')){ excelResults.add( ExcelResult.errorMessage("单选或多选题答案只能为英文字母大写",row,tl)); flag = 0; } } if(flag == 1){ tl.setStda(sheet.getRow(row).getCell(rol)+""); } }else if(tl.getStlx().equals("03")){ //判断题 System.out.println("判断答案:" + (sheet.getRow(row).getCell(rol)+"")); if(!((sheet.getRow(row).getCell(rol)+"").equals("1.0") || (sheet.getRow(row).getCell(rol)+"").equals("0.0"))){ excelResults.add( ExcelResult.errorMessage("判断题答案只能为1(正确)或0(错误)",row,tl)); flag = 0; }else{ if((sheet.getRow(row).getCell(rol)+"").equals("1.0")){ //将1.0变为1插入数据库 tl.setStda("1"); } if((sheet.getRow(row).getCell(rol)+"").equals("0.0")){ //将0.0变为1插入数据库 tl.setStda("0"); } } }else{ //填空或主管 //试题答案为空 if((sheet.getRow(row).getCell(rol)+"").equals("")){ excelResults.add( ExcelResult.errorMessage("试题答案为空",row,tl)); flag = 0; }else{ tl.setStda(sheet.getRow(row).getCell(rol)+""); } } } if(rol ==5){ STKMExample example = new STKMExample(); STKMExample.Criteria criteria = example.createCriteria(); criteria.andMcLike(sheet.getRow(row).getCell(rol)+""); List<STKM> stkms = stkmMapper.selectByExample(example); System.out.println("stkms:"+stkms); if(stkms.size() == 0){ excelResults.add( ExcelResult.errorMessage("试题科目有误",row,tl)); flag = 0; }else{ tl.setStkm(stkms.get(0).getDm()); } // tl.setStkm(stkms.get(0).getDm()); } } System.out.println("&&&&&&&&&&:" + tl); //每一条数据具体内容 if(flag == 1){ int i = testListMapper.insert(tl); if(i>0){ successNumber ++; excelResults.add(ExcelResult.success(row,successNumber,tl)); }else{ failNumber ++; excelResults.add(ExcelResult.error(row,failNumber,tl)); } } } return excelResults; } catch (Exception e) { System.out.println("异常捕获"); ArrayList<ExcelResult> excelResults = new ArrayList<>(); e.printStackTrace(); excelResults.add(ExcelResult.errorMessage()); return excelResults; } } @RequestMapping("/import_2007") @ResponseBody public ArrayList<ExcelResult> import_2007(@RequestParam("file") MultipartFile file, HttpServletRequest request, HttpServletResponse response){ HttpSession session = request.getSession(); Login info = (Login)session.getAttribute("info"); try { ArrayList<ExcelResult> excelResults = new ArrayList<>(); InputStream inputStream = file.getInputStream(); //创建工作簿 XSSFWorkbook xssfWorkbook = new XSSFWorkbook(inputStream); System.out.println("xssfWorkbook对象:" + xssfWorkbook); //读取第一个工作表 XSSFSheet sheet = xssfWorkbook.getSheetAt(0); System.out.println("sheet对象:" + sheet); //获取最后一行的num,即总行数。此处从0开始计数 int maxRow = sheet.getLastRowNum(); List<TestList> testLists = new ArrayList<>(); System.out.println("总行数为:" + maxRow); int successNumber = 0; //成功条数 int failNumber = 0; //失败条数 int flag = 1; //标识符 //从第3行开始插入 for (int row = 2; row <= maxRow; row++) { /*
* 代码同上
*/ } System.out.println("&&&&&&&&&&:" + tl); //每一条数据具体内容 if(flag == 1){ int i = testListMapper.insert(tl); if(i>0){ successNumber ++; excelResults.add(ExcelResult.success(row,successNumber,tl)); }else{ failNumber ++; excelResults.add(ExcelResult.error(row,failNumber,tl)); } } } return excelResults; } catch (Exception e) { System.out.println("异常捕获"); ArrayList<ExcelResult> excelResults = new ArrayList<>(); e.printStackTrace(); excelResults.add(ExcelResult.errorMessage()); return excelResults; } } }
前台代码:
使用了layui,相应插件自行去官网下载
<!--上传按钮-->
<a style="background-color: #1890FF;color: white;float: right;margin-right: 25px;margin-top: 10px;height:35px;" class="btn btn-sm btn-space" data-toggle="modal" data-target="#uploadModal" > <img style="vertical-align: text-bottom;" src="../Images/upload.png" height="16" width="15"/> <font class="dbt_style" style="font-size: 16px">上传试题</font> </a>
<!--上传弹窗-->
<div class="modal fade" id="uploadModal" tabindex="-1" role="dialog" aria-labelledby="ModalLabel1" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content" style="height: 200px;">
<div class="modal-header">
<div style="color: #333333;font-size: 18px;font-weight: bold;float: left;margin-left: 30px">上传试题</div>
<button onclick="closeWindow()" style="float: right;border: 0px;margin-left: 30px"><img src="../Images/chahao.png" style="background-color:#FFFFFF;display: block;" height="14" width="14"/></button>
</div>
<div style="height: 84px;border-bottom: #dfdfdf solid 1px;margin-top: 30px">
<span style="margin-left: 10px;color:red;font-weight: bold;text-align: right">☆</span>
<font class="tc_bt"> 上传位置选择:</font>
<input id="articleImageFile" name="excelFile" type="file" accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" class="form-control" style="width: 300px; display: inline;" />
<input type="button" id="saveZipButton" class="btn" style="width: 90px;height:35px;margin-right: 40px;font-size: 16px;background-color: #1890ff;color: #ffffff;float: right;font-family: STXihei;" value="上传">
</div>
</div>
</div>
</di<!--上传结果弹窗-->
<div id="uploadResult" style="display: none;font-size: 16px;padding: 0" >
<div id="UploadSuccess" style="min-height: 90px;margin-left: 50px">
<!--拼接上传成功信息-->
</div>
<div style="margin-top: 20px">
<span style="margin-left: 50px;font-family:STXihei;font-weight: bold ;color: #333333;">上传错误</span><br />
</div>
<div id="UploadFail" style="margin-top: 10px;margin-left: 50px;min-height: 50px">
<!--拼接上传失败信息-->
</div>
<div style="min-height: 20px">
</div>
<!--文件的上传-->
$("#saveZipButton").on('click', function(){
var formData = new FormData();
var name = $("#articleImageFile").val();
var index = name.lastIndexOf(".");
var suffix = name.substring(index).toLowerCase();
formData.append("file",$("#articleImageFile")[0].files[0]);
formData.append("name",name);//这个地方可以传递多个参数
if(".xlsx" == suffix){
$("#uploadModal").modal('hide');
$.ajax({
url : "/excel/import_2007",
type : 'POST',
async : false,
data : formData,
// 告诉jQuery不要去处理发送的数据
processData : false,
// 告诉jQuery不要去设置Content-Type请求头
contentType : false,
success : function(res) {
//清空模态窗内容
$("#UploadSuccess").html("");
$("#UploadFail").html("");
//console.log(res);
if (res.map.statusCode==500){
layer.alert(res.message)
}else {
for (var index in res) {
if(res[index].map.statusCode == 200){ //上传正确信息
if(res[index].map.testList.stlx == "01"){
var html = "<div>\n" +
"<img src=\"../Images/true.png\" width=\"20px\" height=\"20px\"> <span>单选题:</span> <span>"+ res[index].map.testList.stmc +"</span><br>\n" +
"</div>"
}
if(res[index].map.testList.stlx == "02"){
var html = "<div>\n" +
"<img src=\"../Images/true.png\" width=\"20px\" height=\"20px\"> <span>多选题:</span> <span>"+ res[index].map.testList.stmc +"</span><br>\n" +
"</div>"
}
if(res[index].map.testList.stlx == "03"){
var html = "<div>\n" +
"<img src=\"../Images/true.png\" width=\"20px\" height=\"20px\"> <span>判断题:</span> <span>"+ res[index].map.testList.sttg +"</span><br>\n" +
"</div>"
}
if(res[index].map.testList.stlx == "04"){
var html = "<div>\n" +
"<img src=\"../Images/true.png\" width=\"20px\" height=\"20px\"> <span>填空题:</span> <span>"+ res[index].map.testList.sttg +"</span><br>\n" +
"</div>"
}
if(res[index].map.testList.stlx == "05"){
var html = "<div>\n" +
"<img src=\"../Images/true.png\" width=\"20px\" height=\"20px\"> <span>主观题:</span> <span>"+ res[index].map.testList.sttg +"</span><br>\n" +
"</div>"
}
$("#UploadSuccess").append(html);
}
if(res[index].map.statusCode == 500){ //上传错误信息
var rownuber = parseInt(res[index].map.row) + 1;
if(res[index].map.testList.stlx == "01"){
var html = " <div>\n" +
"<img src=\"../Images/false.png\" width=\"17px\" height=\"17px\"> <span style=\"color: red\">单选题(第"+ rownuber +"行):</span> <span>"+ res[index].map.errorMessage +"</span><br>\n" +
"</div>"
}else if(res[index].map.testList.stlx == "02"){
var html = " <div>\n" +
"<img src=\"../Images/false.png\" width=\"17px\" height=\"17px\"> <span style=\"color: red\">多选题(第"+ rownuber +"行):</span> <span>"+ res[index].map.errorMessage +"</span><br>\n" +
"</div>"
}else if(res[index].map.testList.stlx == "03"){
var html = " <div>\n" +
"<img src=\"../Images/false.png\" width=\"17px\" height=\"17px\"> <span style=\"color: red\">判断题(第"+ rownuber +"行):</span> <span>"+ res[index].map.errorMessage +"</span><br>\n" +
"</div>"
}else if(res[index].map.testList.stlx == "04"){
var html = " <div>\n" +
"<img src=\"../Images/false.png\" width=\"17px\" height=\"17px\"> <span style=\"color: red\">填空题(第"+ rownuber +"行):</span> <span>"+ res[index].map.errorMessage +"</span><br>\n" +
"</div>"
}else if(res[index].map.testList.stlx == "05"){
var html = " <div>\n" +
"<img src=\"../Images/false.png\" width=\"17px\" height=\"17px\"> <span style=\"color: red\">主观题(第"+ rownuber +"行):</span> <span>"+ res[index].map.errorMessage +"</span><br>\n" +
"</div>"
}else{
var html = " <div>\n" +
"<img src=\"../Images/false.png\" width=\"17px\" height=\"17px\"> <span style=\"color: red\">未知题(第"+ rownuber +"行):</span> <span>"+ res[index].map.errorMessage +"</span><br>\n" +
"</div>"
}
$("#UploadFail").append(html);
}
}
parent.layer.msg('正在校验文件内容,请稍候...', {shade: 0.3},function () {
layer.open({
type: 1,
title: ["上传结果", "color:#333333"], //不显示标题栏
closeBtn: false,
area: '600px;',
shade: 0.3,
id: 'LAY_layuipro', //设定一个id,防止重复弹出
btn: ['确认'],
btnAlign: 'a',
moveType: 1, //拖拽模式,0或者1
content: $("#uploadResult"),
yes: function(index,layero) {
$("#articleImageFile").val(""); //清空选择文件内容
search(pageNum,pageSize);
layer.close(index);
}
});
})
//错误信息窗结束
}
},
error:function (msg) {
layer.msg("程序发生错误,请联系技术人员!");
}
});
}else if(".xls" == suffix){
$("#uploadModal").modal('hide');
$.ajax({
url : "/excel/import_2003",
type : 'POST',
async : false,
dataType: "json",
data : formData,
// 告诉jQuery不要去处理发送的数据
processData : false,
// 告诉jQuery不要去设置Content-Type请求头
contentType : false,
success : function(res) {
//layer.msg('数据加载中,请稍后...',{shade: 0.3},function () {
//清空模态窗内容
$("#UploadSuccess").html("");
$("#UploadFail").html("");
//console.log(res);
if (res.map.statusCode==500){
layer.alert(res.message)
}else {
for (var index in res) {
<!--内容同上->
}
},
error:function (msg) {
layer.msg("程序发生错误,请联系技术人员!");
}
});
}else{
if($("#articleImageFile").val() == null || $("#articleImageFile").val() == "" ){
layer.alert("请选择模板文件!!!");
}else{
layer.alert("文件格式不对,请选择xls或xlsx格式!");
}
}
});