jsp讀取Excel檔案內容
阿新 • • 發佈:2019-01-23
需要的jar包 :jxl.jar
讀取檔案程式碼:
// 得到上傳檔案的儲存目錄,將上傳的檔案存放於WEB-INF目錄下,不允許外界直接訪問,保證上傳檔案的安全 String savePath = this.getServletContext().getRealPath( "/WEB-INF/upload"); // 上傳時生成的臨時檔案儲存目錄 String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp"); int serverid = 0; int sid = 0; int gid = 0; byte answerLibraryType = 0; String className = ""; String roleName = ""; boolean bool = true;//判斷資料是否正確 File tmpFile = new File(tempPath); StringBuffer str = new StringBuffer(); if (!tmpFile.exists()) { // 建立臨時目錄 tmpFile.mkdir(); } // 訊息提示 String message = ""; try { // 使用Apache檔案上傳元件處理檔案上傳步驟: // 1、建立一個DiskFileItemFactory工廠 DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(1024 * 100);// 設定緩衝區的大小為100KB,如果不指定,那麼緩衝區的大小預設是10KB // 設定上傳時生成的臨時檔案的儲存目錄 factory.setRepository(tmpFile); // 2、建立一個檔案上傳解析器 ServletFileUpload upload = new ServletFileUpload(factory); upload.setProgressListener(new ProgressListener() { @Override public void update(long pBytesRead, long pContentLength, int arg2) { // TODO Auto-generated method stub System.out.println("檔案大小為:" + pContentLength + ",當前已處理:" + pBytesRead); } }); // 解決上傳檔名的中文亂碼 upload.setHeaderEncoding("UTF-8"); // 3、判斷提交上來的資料是否是上傳表單的資料 if (!ServletFileUpload.isMultipartContent(request)) { // 按照傳統方式獲取資料 return; } // 設定上傳單個檔案的大小的最大值,目前是設定為1024*1024位元組,也就是1MB upload.setFileSizeMax(1024 * 1024); // 設定上傳檔案總量的最大值,最大值=同時上傳的多個檔案的大小的最大值的和,目前設定為10MB upload.setSizeMax(1024 * 1024 * 10); // 4、使用ServletFileUpload解析器解析上傳資料,解析結果返回的是一個List<FileItem>集合,每一個FileItem對應一個Form表單的輸入項 @SuppressWarnings("unchecked") List<FileItem> list = upload.parseRequest(request); // 實驗新增一個目錄到ftp for (FileItem item : list) { // 如果fileitem中封裝的是普通輸入項的資料 if (item.isFormField()) { String name = item.getFieldName(); // 解決普通輸入項的資料的中文亂碼問題 String value = item.getString("UTF-8"); if (name.equals("serverid")) { serverid = Integer.parseInt(value); } if (name.equals("sid")) { sid = Integer.parseInt(value); } if (name.equals("gid")) { gid = Integer.parseInt(value); } if (name.equals("answerLibraryType")) { answerLibraryType = Byte.parseByte(value); } if (name.equals("className")) { className = value; } if (name.equals("roleName")) { roleName = value; } System.out.println(name + "=" + value); } else {// 如果fileitem中封裝的是上傳檔案 // 得到上傳的檔名稱 String filename = item.getName(); System.out.println(filename); if (filename == null || filename.trim().equals("")) { continue; } // 注意:不同的瀏覽器提交的檔名是不一樣的,有些瀏覽器提交上來的檔名是帶有路徑的,如: // c:\a\b\1.txt,而有些只是單純的檔名,如:1.txt // 處理獲取到的上傳檔案的檔名的路徑部分,只保留檔名部分 filename = filename .substring(filename.lastIndexOf("\\") + 1); String fileExtName = filename.substring(filename .lastIndexOf(".") + 1); // 如果需要限制上傳的檔案型別,那麼可以通過檔案的副檔名來判斷上傳的檔案型別是否合法 System.out.println("上傳的檔案的副檔名是:" + fileExtName); if(fileExtName=="xls"){ message = "上傳檔案格式錯誤,請將檔案格式轉換成xls格式"; }else{ // 獲取item中的上傳檔案的輸入流 InputStream is = item.getInputStream(); Workbook rwb = Workbook.getWorkbook(is); // 這裡有兩種方法獲取sheet表:名字和下標(從0開始) // Sheet st = rwb.getSheet("original"); Sheet st = rwb.getSheet(0); // Sheet的下標是從0開始 // 獲取第一張Sheet表 Sheet rst = rwb.getSheet(0); // 獲取Sheet表中所包含的總列數 int rsColumns = rst.getColumns(); // 獲取Sheet表中所包含的總行數 int rsRows = rst.getRows(); // 獲取指定單元格的物件引用 for (int i = 0; i < rsRows; i++) { for (int j = 0; j < rsColumns; j++) { Cell cell = rst.getCell(j, i); if(cell.getContents()==null || cell.getContents().length()<1){ message = "該檔案第"+(i+1)+"行,第"+(j+1)+"列為空或者有錯誤!請檢查檔案,修改之後重新上傳!"; bool = false; break; } str.append(cell.getContents()).append("#"); } str.append("_"); System.out.println(str.toString()); } // 關閉 rwb.close(); // 刪除處理檔案上傳時生成的臨時檔案 item.delete(); if(!bool){ break; } } } } } catch (Exception e) { e.printStackTrace(); }
jsp標籤:
<table class="item" id="items"> <tr class="info"> <td colspan ="1"> <label>上傳答題</label> </td> <td colspan ="1"> <input type="file" name="file[1]" id="fileid"/> </td> </tr> </table>