java實現Excel導入數據庫,並返回導入信息


工具類:

  工具類中的內容可以根據自己的情況進行修改

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"/>&nbsp;&nbsp;<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">&nbsp;&nbsp;上傳位置選擇:</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\">&nbsp;<span>單選題:</span>&nbsp;<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\">&nbsp;<span>多選題:</span>&nbsp;<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\">&nbsp;<span>判斷題:</span>&nbsp;<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\">&nbsp;<span>填空題:</span>&nbsp;<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\">&nbsp;<span>主觀題:</span>&nbsp;<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\">&nbsp;<span style=\"color: red\">單選題(第"+ rownuber +"行):</span>&nbsp;<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\">&nbsp;<span style=\"color: red\">多選題(第"+ rownuber +"行):</span>&nbsp;<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\">&nbsp;<span style=\"color: red\">判斷題(第"+ rownuber +"行):</span>&nbsp;<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\">&nbsp;<span style=\"color: red\">填空題(第"+ rownuber +"行):</span>&nbsp;<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\">&nbsp;<span style=\"color: red\">主觀題(第"+ rownuber +"行):</span>&nbsp;<span>"+ res[index].map.errorMessage +"</span><br>\n" +
"</div>"
}else{
var html = " <div>\n" +
"<img src=\"../Images/false.png\" width=\"17px\" height=\"17px\">&nbsp;<span style=\"color: red\">未知題(第"+ rownuber +"行):</span>&nbsp;<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格式!");
}

}


});

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM