工具類:
工具類中的內容可以根據自己的情況進行修改
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格式!");
}
}
});