POI實現Excel導入數據

1.Controller

/**
     * 導入Excel
     * @param cd
     * @param req
     * @param resp
     */
    @PostMapping("/putCarRecords")
    @RequiresPermissions("carRecord:putCarRecords")
    @ResponseBody
    Result<String> putCarRecords(MultipartFile upfile){
        String fileName=upfile.getOriginalFilename();
        long size=upfile.getSize();
        if(StringUtils.isEmpty(fileName)||size==0){
            return Result.build(Result.CODE_FAIL, "上傳失敗");
        }
        return carRecordService.putCarRecords(fileName, upfile);
    }

2.service

@Override
    public Result<String> putCarRecords(String name, MultipartFile file) {
        Map<String,Long> reasonMap=new HashMap<String,Long>();
        Map<String,Long> carModelMap=new HashMap<String,Long>();
        List<ReasonDO> reasonList = reasonService.selectList(null);
        List<CarModelDO> carList = carModelService.selectList(null);
        
        for(ReasonDO reason:reasonList){
            reasonMap.put(reason.getReasonName(), reason.getReasonId());
        }
        for(CarModelDO carModelDO:carList){
            carModelMap.put(carModelDO.getCarModelName(), carModelDO.getCarModelId());
        }
        //解析excel,獲取客戶信息集合。
        try {
            List<CarRecordDO> carRecordDOs = ExcelUtil.getExcelInfo(name, file, reasonMap, carModelMap);
            if(carRecordDOs != null){
                if(carRecordDOs.size()!=0){
                    insertBatch(carRecordDOs);
                    return Result.ok();
                }
                return Result.build(Result.CODE_FAIL, "請至少上傳一條數據!!");
                
            }else{
                return Result.build(Result.CODE_FAIL, "插入失敗!!");
            }
        } catch (Exception e) {
            e.printStackTrace();
            return Result.build(Result.CODE_FAIL, e.getMessage());
        }

       
    }

3.ExcelUtil

 /**
     * 讀EXCEL文件,獲取客戶信息集合
     * @param
     * @return
     */
    public static List<CarRecordDO> getExcelInfo(String fileName, MultipartFile Mfile,Map<String,Long> resonMap,Map<String,Long> carModelMap){

        //初始化客戶信息的集合
        List<CarRecordDO> customerList=new ArrayList<CarRecordDO>();
        //初始化輸入流
        InputStream is = null;
        try{
            //驗證文件名是否合格
            if(!validateExcel(fileName)){
                return null;
            }
            //根據文件名判斷文件是2003版本還是2007版本
            boolean isExcel2003 = true;
            if(WDWUtil.isExcel2007(fileName)){
                isExcel2003 = false;
            }
            //根據新建的文件實例化輸入流
            is =  Mfile.getInputStream();
            //根據excel里面的內容讀取客戶信息
            customerList = getExcelInfo(is, isExcel2003, resonMap, carModelMap);
            is.close();
        }catch(Exception e){
            throw new RuntimeException(e.getMessage());
        } finally{
            if(is !=null)
            {
                try{
                    is.close();
                }catch(IOException e){
                    is = null;
                    e.printStackTrace();
                }
            }
        }
        return customerList;
    }
    /**
     * 根據excel里面的內容讀取客戶信息
     * @param is 輸入流
     * @param isExcel2003 excel是2003還是2007版本
     * @return
     * @throws IOException
     */
    private static  List<CarRecordDO> getExcelInfo(InputStream is,boolean isExcel2003,Map<String,Long> resonMap,Map<String,Long> carModelMap){
        List<CarRecordDO> customerList=null;
        try{
            /** 根據版本選擇創建Workbook的方式 */
            Workbook wb = null;
            //當excel是2003時
            if(isExcel2003){
                wb = new HSSFWorkbook(is);
            }
            else{//當excel是2007時
                wb = new XSSFWorkbook(is);
            }
            //讀取Excel里面客戶的信息
            customerList=readExcelValue(wb, resonMap,carModelMap);
        }
        catch (IOException e)  {

            throw new RuntimeException(e.getMessage());
        }
        return customerList;
    }
    /**
     * 讀取Excel里面客戶的信息
     * @param wb
     * @return
     */
    private static List<CarRecordDO> readExcelValue(Workbook wb,Map<String,Long> resonMap,Map<String,Long> carModelMap){
        //得到第一個shell
        Sheet sheet=wb.getSheetAt(0);
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");

        //得到Excel的行數  物理行數
        //int totalRows=sheet.getPhysicalNumberOfRows();
        int totalRows=sheet.getLastRowNum()+1;
        //得到列數
        int totalCells=0;

        //得到Excel的列數(前提是有行數)
        if(totalRows>=1 && sheet.getRow(0) != null){
            totalCells=sheet.getRow(6).getPhysicalNumberOfCells();
        }

        List<CarRecordDO> cardRecords=new ArrayList<CarRecordDO>();
        CarRecordDO cardRecordDO;
        //循環Excel行數,從第8行開始。標題不入庫
        for(int r=7;r<totalRows;r++){
            Row row = sheet.getRow(r);
            if (row == null) continue;
            cardRecordDO=new CarRecordDO();
            //循環Excel的列
            for(int c = 0; c <=totalCells; c++){
                    Cell cell = row.getCell(c);
                    switch(c){
                    case 0:
                        if(cell==null){
                            throw new RuntimeException("請填寫車主姓名");
                        }
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        String carOwnerName=cell.getStringCellValue();
                        cardRecordDO.setCarOwnerName(carOwnerName.replace(" ", ""));
                        break;
                    case 1:
                        if(cell==null){
                            throw new RuntimeException("請填寫車主電話");
                        }
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        String stringCellValue = cell.getStringCellValue();
                        cardRecordDO.setCarOwnerTel(stringCellValue.replace(" ", ""));
                        break;
                    case 2:
                        String stringCellValue2 = cell.getStringCellValue();
                        if(!StringUtils.isEmpty(stringCellValue2)){
                            cardRecordDO.setCarNumber(stringCellValue2.replace(" ", ""));
                        }
                        break;
                    case 3:
                        if(cell==null){
                            throw new RuntimeException("請填寫車型");
                        }
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        String stringCellValue3 = cell.getStringCellValue();
                        if(carModelMap.containsKey(stringCellValue3)){
                            cardRecordDO.setCarModelId(carModelMap.get(stringCellValue3.replace(" ", "")));
                        }else{
                            throw new RuntimeException("請選擇指定車型");
                        }
                        
                        break;
                    case 4:
                        if(cell==null){
                            continue;
                        }
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        String stringCellValue4 = cell.getStringCellValue();
                        if(!StringUtils.isEmpty(stringCellValue4)){
                            if(resonMap.containsKey(stringCellValue4)){
                                cardRecordDO.setReasonId(resonMap.get(stringCellValue4.replace(" ", "")));
                            }else{
                                throw new RuntimeException("請填寫正確進場原因");
                            }
                        }
                        break;
                    case 5:
                        if(cell==null){
                            throw new RuntimeException("請輸入進場值班員");
                        }
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        String stringCellValue5 = cell.getStringCellValue();
                        cardRecordDO.setInUserName(stringCellValue5.replace(" ", ""));
                        break;
                    case 6:
                        if(cell==null){
                            throw new RuntimeException("請輸入進場時間");
                        }
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        String stringCellValue6 = cell.getStringCellValue();
                        try {
                            cardRecordDO.setInTime(sdf.parse(stringCellValue6.replace(" ", "")));
                        } catch (ParseException e) {
                            
                            throw new RuntimeException("時間格式錯誤");
                        }
                        break;
                    case 7:
                        if(cell==null){
                            continue;
                        }
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        String stringCellValue7 = cell.getStringCellValue();
                        if(!StringUtils.isEmpty(stringCellValue7)){
                            try {
                                cardRecordDO.setOutTime(sdf.parse(stringCellValue7.replace(" ", "")));
                            } catch (ParseException e) {
                                throw new RuntimeException("時間格式錯誤");
                            }
                        }
                        break;
                    case 8:
                        if(cell==null){
                            continue;
                        }
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        String stringCellValue8 = cell.getStringCellValue();
                        if(!StringUtils.isEmpty(stringCellValue8)){
                            cardRecordDO.setOutUserName(stringCellValue8.replace(" ", ""));
                        }
                        break;
                    case 9:
                        if(cell==null){
                            throw new RuntimeException("請輸入受理單位");
                        }
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        String stringCellValue9 = cell.getStringCellValue();
                        cardRecordDO.setAcceptanceUnit(stringCellValue9);
                        break;
                    case 10:
                        if(cell==null){
                            throw new RuntimeException("請輸入發送機型號");
                        }
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        String engineNumber = cell.getStringCellValue();
                        cardRecordDO.setEngineNumber(engineNumber);
                        break;
                    case 11:
                        if(cell==null){
                            throw new RuntimeException("請輸入車架號");
                        }
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        String vinNo = cell.getStringCellValue();
                        cardRecordDO.setVinNo(vinNo);
                        break;
                    case 12:
                        if(cell==null){
                            throw new RuntimeException("請輸入事發地點");
                        }
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        String accidentAddress = cell.getStringCellValue();
                        cardRecordDO.setAccidentAddress(accidentAddress);
                        break;
                    case 13:
                        if(cell==null){
                            throw new RuntimeException("請輸入停放區域");
                        }
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        String parkedArea = cell.getStringCellValue();
                        cardRecordDO.setParkedArea(parkedArea);
                        break;
                    case 14:
                        if(cell==null){
                            throw new RuntimeException("請輸入經辦人");
                        }
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        String agent = cell.getStringCellValue();
                        cardRecordDO.setAgent(agent);
                        break;
                    
                    
                    case 15:
                        if(cell==null){
                            throw new RuntimeException("請選擇狀態");
                        }
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        String statusStr = cell.getStringCellValue();
                        if(statusStr.replace(" ", "").equals("進場")){
                            cardRecordDO.setStatus(0);
                        }else if(statusStr.replace(" ", "").equals("出場")){
                            cardRecordDO.setStatus(1);
                        }else{
                            throw new RuntimeException("請選擇正確狀態");
                        }
                        break;
                    }
                //添加客戶
            }
            cardRecords.add(cardRecordDO);
        }
        return cardRecords;
    }

4.前端

$(".filebox").on("change","#file",function(){
    //得到文件路徑
    var filePath = $('#file').val();
    if(filePath!=""){
        //對文件格式進行驗證(簡單驗證)
        var d1=/\.[^\.]+$/.exec(filePath);
        if(d1==".xls"){
              var formData=new FormData();
              formData.append("upfile",$("#file")[0].files[0]);
              $.ajax({
                url:prefix+'/putCarRecords',
                type:'POST',
                data:formData,
                /*
                改成contentType為false才會加上正確的ContentType
                */
                contentType: false,
                  /**
                  * 必須false才會避開jQuery對 formdata 的默認處理
                  * XMLHttpRequest會對 formdata 進行正確的處理
                  */
                  processData: false,
                  success: function (data) {
                      if(data.code==0){
                          window.location.reload();
                      }else{
                          layer.msg(data.msg);
                          $("#file").val("");
                      }
                  },
                  error:function(){
                      layer.msg("網絡錯誤!");
                      $("#file").val("");
                  }
            });
        }else{
            layer.msg("請選擇.xls文件");
        }
    }else{
        layer.msg("請選擇.xls文件!");
    }
});
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,197評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,415評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,104評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,884評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,647評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,130評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,208評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,366評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,887評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,737評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,939評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,478評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,174評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,586評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,827評論 1 283
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,608評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,914評論 2 372

推薦閱讀更多精彩內容

  • 1.環境準備 centos7 1.1、yum安裝設置 yum list |grep openstackcentos...
    davisgao閱讀 5,507評論 1 16
  • 1.Pod Pod是k8s的最基本的操作單元,包含一個或多個緊密相關的容器,類似于豌豆莢的概念。一個Pod可以被一...
    jony456123閱讀 7,448評論 0 5
  • 對于java中的思考的方向,1必須要看前端的頁面,對于前端的頁面基本的邏輯,如果能理解最好,不理解也要知道幾點。 ...
    神尤魯道夫閱讀 824評論 0 0
  • 一、部署基礎環境:A.IP地址規劃:controller節點:192.168.0.201,compute節點:19...
    stone2020閱讀 2,872評論 0 1
  • Swift1> Swift和OC的區別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,120評論 1 32