2017-09-16 157 views
-1

編輯 - 感謝您的回覆。已經做出了改變,並建議發現問題是空行上的NOW。Java Apache POI無法正常工作

我正在寫一個程序,加載各種Excel表單並提供基於特定標準的輸出。見下面的代碼。我的問題是代碼不會寫入或保存到DISPLAY表單。我意識到下面的代碼不是特別整潔,但複製粘貼來檢查我是否可以得到任何保存。如果我將循環中的所有內容註釋掉,並在保存之前嘗試寫入單元格,它會在表單中顯示。如果我不註釋掉數據格式化程序部分,即使在我正在保存輸出文件的部分之前嘗試寫入單元格時,它也不起作用。我猜這個問題是由數據格式化程序造成的,但我無法解決原因。

public void checkForChanges() { 
    try { 
     FileInputStream fsIP = new FileInputStream("Change.xls"); 
     HSSFWorkbook fWorkbook = new HSSFWorkbook(fsIP); 
     HSSFSheet recipeSheet = fWorkbook.getSheet("RECIPE STEPS"); 
     HSSFSheet fromSheet = fWorkbook.getSheet("FROM FORMAT"); 
     HSSFSheet toSheet = fWorkbook.getSheet("TO FORMAT"); 
     HSSFSheet displaySheet = fWorkbook.getSheet("DISPLAY"); 
     for (int i = 0; i < 30; i++) { 
      DataFormatter recipeFormatter = new DataFormatter(); 
      HSSFRow recipeRow = recipeSheet.getRow(i); 

      HSSFCell recipeCellsColumnA = recipeRow.getCell(0); 
      String recipeCellValueColumnA = recipeFormatter.formatCellValue(recipeCellsColumnA); 
      System.out.println(recipeCellValueColumnA); 

      HSSFCell recipeCellsColumnB = recipeRow.getCell(1); 
      String recipeCellValueColumnB = recipeFormatter.formatCellValue(recipeCellsColumnB); 
      System.out.println(recipeCellValueColumnB); 


      DataFormatter fromFormatter = new DataFormatter(); 
      HSSFRow fromRow = fromSheet.getRow(i); 
      HSSFCell fromCells = fromRow.getCell(0); 
      String fromCellValue = fromFormatter.formatCellValue(fromCells); 
      System.out.println(fromCellValue); 

      DataFormatter toFormatter = new DataFormatter(); 
      HSSFRow toRow = toSheet.getRow(i); 
      HSSFCell toCells = toRow.getCell(0); 
      String toCellValue = toFormatter.formatCellValue(toCells); 
      System.out.println(toCellValue); 

      if (recipeCellValueColumnB.equals("YES") && !fromCellValue.equals(toCellValue)) {  
       System.out.println("PUT VALUE FROM 'TO FORMAT' COLUMN A ROW I INTO 'DISPLAY' SHEET CELL COLUMN B ROW I"); 
       System.out.println("PUT VALUE FROM 'RECIPE STEPS' COLUMN A ROW I INTO 'DISPLAY' SHEET CELL COLUMN A ROW I"); 
       Row row = displaySheet.createRow(0); 
       Cell cell = row.createCell(0); 
       cell.setCellValue("TEST");            
      } else if (recipeCellValueColumnB.equals("YES") && fromCellValue.equals(toCellValue)) { 
       System.out.println("SET CELL IN 'DISPLAY' SHEET COLUMN A ROW I TO '' "); 
       System.out.println("SET CELL IN 'DISPLAY' SHEET COLUMN B ROW I TO '' "); 
       Row row = displaySheet.createRow(0); 
       Cell cell = row.createCell(0); 
       cell.setCellValue("TEST"); 
      } else if (recipeCellValueColumnB.equals("NO")) { 
       System.out.println("PUT VALUE FROM 'TO FORMAT' COLUMN A ROW I INTO 'DISPLAY' SHEET CELL COLUMN B ROW I"); 
       System.out.println("PUT VALUE FROM 'RECIPE STEPS' COLUMN A ROW I INTO 'DISPLAY' SHEET CELL COLUMN A ROW I"); 
       Row row = displaySheet.createRow(0); 
       Cell cell = row.createCell(0); 
       cell.setCellValue("TEST"); 
      }else if (recipeCellValueColumnA.equals("Step Name") && recipeCellValueColumnB.equals("Always Compare?")) { 
       System.out.println("SET CELL IN DISPLAY COLUMN A ROW I TO 'REQUIRED STEPS'"); 
       System.out.println("PUT VALUE FROM 'TO FORMAT' COLUMN A ROW I INTO 'DISPLAY' SHEET CELL COLUMN B ROW I"); 
       Row row = displaySheet.createRow(0); 
       Cell cell = row.createCell(0); 
       cell.setCellValue("TEST"); 
      } 
     } 
     FileOutputStream output_file = new FileOutputStream(new File("Change.xls")); 
     BufferedOutputStream bos = new BufferedOutputStream(output_file); 
     fWorkbook.write(output_file); 
     fWorkbook.close(); 
     bos.close(); 
     output_file.close(); 


    }catch(Exception e){ 

    } 
} 

對不起,任何糟糕的解釋,這是遲到,我累了,沮喪!

感謝

+0

做什麼@Stephen C建議。你可能會發現'fromSheet。getRow(i);'返回null'爲完全空行,因爲它們沒有存儲到文件中。所以'fromRow.getCell(0);'然後會拋出一個'NullPointerException'。因此,在進一步使用它之前,您需要檢查'fromRow'是否爲'null'。 –

回答

2

與您的代碼的問題是這樣的:

catch(Exception e) 
    { 

    } 

這是說:「不要告訴我任何異常」。這是一種特殊的壓迫......這是可怕的,懶惰的,而且很明顯是錯誤的。

代碼中的某處存在,可能是直接拋出異常或導致POI(或某物)拋出異常。這是一個錯誤。但是,你可怕的異常壓扁是扔掉證據,這將允許您識別並修復該錯誤。

我猜這個問題是由數據格式化程序引起的,但我無法弄清楚爲什麼。

這可能是很多事情......包括像NPE一樣愚蠢或傳遞不正確文件名的超出範圍索引。

解決方案:

  • 擺脫嘗試捕捉的,並允許例外傳播給調用者。
  • 在調用者(或進一步向上堆棧)處理意外通過打印或記錄堆棧跟蹤並導致應用程序失敗的異常。
  • 運行修改後的程序。
  • 當它失敗時(可能會),讀取異常消息和堆棧跟蹤並找出潛在的問題;即你的可怕異常壓縮隱藏的問題。

然後記住永遠不要在Java或任何其他編程語言中壓縮像這樣的所有異常。

(它是有時候可以壓縮特定上下文中的特定異常......但只有仔細分析代碼後才能確保不會同時壓縮其他(意外)異常。)