Java Apache POI无法正常运行代码

时间:2017-09-16 02:27:32

标签: 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){

    }
}

对于任何可怜的解释感到抱歉,已经很晚了,我感到很累和沮丧!

由于

1 个答案:

答案 0 :(得分:2)

您的代码存在以下问题:

catch(Exception e)
  {

  }

这就是说“不要告诉我任何例外情况”。这是挤压的例外......它是可怕的,懒惰的,而且是完全错误的。

代码中的某处可能某些东西要么直接抛出异常,要么导致POI(或其他东西)抛出异常。那是一个错误。但是,你可怕的异常压缩是丢弃证据,这将允许你识别并修复错误。

  

我猜测问题是由数据格式化程序引起的,但我无法解决原因。

这可能是很多事情......包括像NPE这样的愚蠢行为或传递不正确文件名的超出范围索引。

解决方案:

  • 摆脱try catch,并允许异常传播给调用者。
  • 在调用者(或堆栈中)通过打印或记录堆栈跟踪并导致应用程序失败来处理意外异常。
  • 运行修改后的程序。
  • 当它失败时(可能会),阅读异常消息和堆栈跟踪并找出底层问题是什么;也就是说,你可怕的异常压迫隐藏的问题。

然后记住永远不要用Java或任何其他编程语言压缩所有类似的异常。

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