2012-10-31 46 views
0

場景:我正在嘗試使用JExcel讀取excel文件並將數據轉儲到Or​​acle數據庫中。我要求用戶瀏覽並選擇一個文件從他們的系統中讀取,然後讀取相同的數據並將數據(不保存物理文件)轉儲到Or​​acle數據庫中。FileNotFound讀取excel文件時出現異常

<form id='uploadform'> 
    <table class='detailTable'> 
    <tr> 
     <td class='detailTableTD'>Select File to Upload:</td> 
     <td class='detailTableTD'> 
      <input type='file' id='fileUpload'> 
     </td> 
    </tr> 
    <tr> 
     <td class='detailTableTD'></td> 
     <td class='detailTableTD'> 
      <button id='uploadBtn' onclick="upload();">Upload</button> 
      <button id='backBtn'>Back</button>         
     </td> 
    </tr> 
    </table> 
</form> 

爪哇:

public int[][] readFromExcel(final String excelFilePath) throws ApplicationException { 
    String excelPath = excelFilePath.trim(); 
    File inputWorkbook = new File(excelPath); 
    Workbook workbook; 
    MyObj drawBk; 
    List drBkLst = new ArrayList(); 
    String tmpStr = ""; 
    try { 
     workbook = Workbook.getWorkbook(inputWorkbook); 
     Sheet sheet = workbook.getSheet(0); 
     for (int j = 1; j < sheet.getRows(); j++) { 
      drawBk = new MyObj(); 
      for (int i = 0; i < sheet.getColumns(); i++) { 
       Cell cell = sheet.getCell(i, j); 
       switch (i) { 
       case 0: 
        drawBk.setSerialNumber(cell.getContents()); 
        break; 
       case 1: 
        drawBk.setMediaNumber(cell.getContents()); 
        break; 
       case 2: 
        tmpStr = cell.getContents(); 
        if (!(tmpStr.trim().equalsIgnoreCase("Y") || tmpStr.trim().equalsIgnoreCase("N"))) 
         continue; 
        else 
         drawBk.setMnProcessInd(tmpStr); 
        drawBk.setSnProcessInd(tmpStr); 
        break; 
       } 
      } 
      drawBk.setLastChangedUser(userId); 
      drBkLst.add(drawBk); 
     } 
    } catch (Exception readExcelEx) {} 
return insertExcelDataToDatabase(drBkLst); 
} 

在這裏,我捕捉路徑和作爲參數傳遞到Java方法用於處理細胞和創建對象的ArrayList的將被插入到DB。這裏所有簡單的代碼。 從本地部署運行時,它都可以正常工作,但是當我將EAR部署到服務器時,當我瀏覽文件並選擇文件時,我開始獲取FileNotFound異常。 我覺得這一切都是由於一些相對/絕對路徑問題,但無法調試,我需要它很快。任何確切的幫助幫助將不勝感激?

謝謝。

+3

請添加您使用的Java代碼。 – 2012-10-31 10:45:01

+0

添加處理表單的代碼以及如何在服務器端獲取文件會很有用。 – jddsantaella

+0

@Tichodroma添加了閱讀excel的Java代碼。謝謝。 – axiomtheorem

回答

1

您將不得不在服務器上的某個臨時目錄中寫入文件。你不能使用你的系統文件路徑從服務器(ear)。

您將不得不將表單更改爲multipart並處理請求。看看這個鏈接(http://www.servletworld.com/servlet-tutorials/servlet-file-upload-example.html)。

您可以避免將文件寫入臨時文件(無論如何它將由tmp寫入,但不必提供路徑)。使用

FileInputStream fis = new FileInputStream(new File()); //after reading it using file io. 
Workbook workbook = WorkbookFactory.create(fis); 
+0

您能否詳細說明我能做些什麼。謝謝。 – axiomtheorem

+0

請閱讀更新的評論。 – Ankit

+0

您可以分享任何演示如何在處理之前將文件傳輸到TEMP服務器位置的鏈接嗎? – axiomtheorem

1

我相信當你在本地運行該文件駐留在本地系統上,因此你不會得到任何異常。但是當你在服務器上部署它時,用戶瀏覽的文件仍然在他的機器上,並且沒有到達服務器。您需要創建臨時文件或從文件的請求參數二進制數據中讀取java對象中的數據。

+1

不,你說得對。您無法直接處理位於服務器上用戶計算機上的文件。該文件應該上傳到一個臨時位置,然後從那裏讀取 –

+1

現在,根據添加的代碼,我會說猜測是正確的。 – jddsantaella

+0

您可以請分享任何演示如何在處理前將文件傳輸到TEMP服務器位置的鏈接?謝謝。 – axiomtheorem

相關問題