2017-09-16 118 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或任何其他编程语言中压缩像这样的所有异常。

(它是有时候可以压缩特定上下文中的特定异常......但只有仔细分析代码后才能确保不会同时压缩其他(意外)异常。)