工具类:
工具类中的内容可以根据自己的情况进行修改
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格式!");
}
}
});