POI匯入Excel含.xls和.xlsx
阿新 • • 發佈:2018-12-30
之前用的jxl,但是遇到07版以上的.xlsx字尾的檔案,目前jxl我無法解決.
就用POI做了個簡單的匯入Excel表,含.xls和.xlsx字尾的匯入.
POI中這兩種字尾的檔案,是使用2個物件來操作的.
先寫思路,後附上程式碼.
POI跟JXL有所不一樣.
POI需要excel檔案上傳的全路徑,用全路徑建立IO流,再進行操作.(JXL需要excel檔案上傳後的File物件就可以直接操作了.)
建立好IO流後,就需要判斷一下了,判斷後綴是.xls或是.xlsx
.xls 對應 HSSFWorkbook book=new HSSFWorkbook(io);
.xlsx 對應 XSSFWorkbook book=new XSSFWorkbook(io)
說到這就有個問題了,我寫完程式跑起來之後,.xls檔案匯入沒問題,但是.xlsx檔案還是報錯.
網上查了檢視別人的POI包我都有就是版本不一樣,覺得不是這的問題.不過還是換包試了試.原來問題就在這.
我之前的jar包:
從新下載的jar包:
別的版本的jar包不知道,反正上面的親測有效.
如果你寫完程式碼,.xls的能跑,.xlsx的報異常,可能就是jar包問題了.
之後附上程式碼,因為是自己練習,沒有加上什麼驗證,只是為了跑通的.
/** * 檔案上傳 */ @RequestMapping("/fenye/excelfile") public String excelfile(HttpServletRequest request,MultipartFile excel,Model model ){ /*獲取工程根路徑*/ String path=request.getSession().getServletContext().getRealPath(""); System.out.println(path); /*獲取檔名稱,並用UUID替換檔名*/ String name=UUID.randomUUID().toString()+excel.getOriginalFilename() .substring(excel.getOriginalFilename().lastIndexOf(".")); /*組合新檔案儲存的完整路徑*/ String newName=path+"/excel/"+name; /*建立檔案物件*/ File file=new File(newName); /*判斷檔案路徑是否存在,如不存在建立資料夾*/ if(!file.exists()){ file.mkdirs(); } try { /*寫入檔案*/ excel.transferTo(file); model.addAttribute("msg", "檔案上傳成功!"); } catch (IllegalStateException | IOException e) { model.addAttribute("msg", "檔案上傳失敗!"); e.printStackTrace(); } String msg=fenYeService.importExcel(newName); model.addAttribute("msg", msg); return "upLoadFile"; }
/** * 匯入excel */ private static final int STARTNO=0; @Override public String importExcel(String newName) { /*建立資料庫批量匯入的集合*/ List<Excel> list=new ArrayList<>(); /*工作空間物件*/ Workbook book=null; /*檔案流物件*/ FileInputStream input=null; /*反饋*/ String msg=null; /*通過後綴判斷檔案型別是否匹配*/ if(!newName.endsWith(".xls") && !newName.endsWith(".xlsx")){ msg ="檔案型別錯誤!"; return msg; } try { /*將檔案放入流中*/ input=new FileInputStream(newName); } catch (FileNotFoundException e) { e.printStackTrace(); } /*如果是低版本就建立低版本物件*/ if(newName.endsWith(".xls")){ try { book=new HSSFWorkbook(input); } catch (IOException e) { e.printStackTrace(); } } /*如果是高版本就建立高版本物件*/ if(newName.endsWith(".xlsx")){ try { book=new XSSFWorkbook(input); } catch (IOException e) { e.printStackTrace(); } } /*工作表*/ Sheet sheet=null; /*行*/ Row row=null; /*列*/ String cell=null; /*遍歷工作表*/ for(int i=STARTNO;i<book.getNumberOfSheets();i++){ /*迴圈獲取每一個工作表*/ sheet=book.getSheetAt(i); for(int j=sheet.getFirstRowNum()+1;j<sheet.getLastRowNum();j++){ Excel excel=new Excel(); row=sheet.getRow(j); /*獲取屬性-編號*/ cell=row.getCell(0).toString(); excel.setCode(cell); /*姓名*/ cell=row.getCell(1).toString(); excel.setName(cell); /*部門*/ cell=row.getCell(2).toString(); excel.setDept(cell); /*日期*/ cell=row.getCell(3).toString(); SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd"); try { excel.setDate(format.parse(cell)); } catch (ParseException e) { e.printStackTrace(); } /*備註*/ cell=row.getCell(4).toString(); excel.setRemark(cell); list.add(excel); } } int y=fileExcelMapper.importFileExcel(list); if(y>0){ msg="檔案匯入資料庫成功!"; return msg; }else{ msg="檔案匯入資料庫失敗!"; return msg; } }