1. 程式人生 > >POI匯入Excel含.xls和.xlsx

POI匯入Excel含.xls和.xlsx

之前用的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;
		}
	}