Java Apache POI无法正常工作
问题描述:
编辑 - 感谢您的回复。已经做出了改变,并建议发现问题是空行上的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){
}
}
对不起,任何糟糕的解释,这是迟到,我累了,沮丧!
感谢
答
与您的代码的问题是这样的:
catch(Exception e)
{
}
这是说:“不要告诉我任何异常”。这是一种特殊的压迫......这是可怕的,懒惰的,而且很明显是错误的。
代码中的某处存在,可能是直接抛出异常或导致POI(或某物)抛出异常。这是一个错误。但是,你可怕的异常压扁是扔掉证据,这将允许您识别并修复该错误。
我猜这个问题是由数据格式化程序引起的,但我无法弄清楚为什么。
这可能是很多事情......包括像NPE一样愚蠢或传递不正确文件名的超出范围索引。
解决方案:
- 摆脱尝试捕捉的,并允许例外传播给调用者。
- 在调用者(或进一步向上堆栈)处理意外通过打印或记录堆栈跟踪并导致应用程序失败的异常。
- 运行修改后的程序。
- 当它失败时(可能会),读取异常消息和堆栈跟踪并找出潜在的问题;即你的可怕异常压缩隐藏的问题。
然后记住永远不要在Java或任何其他编程语言中压缩像这样的所有异常。
(它是有时候可以压缩特定上下文中的特定异常......但只有仔细分析代码后才能确保不会同时压缩其他(意外)异常。)
做什么@Stephen C建议。你可能会发现'fromSheet。getRow(i);'返回null'为完全空行,因为它们没有存储到文件中。所以'fromRow.getCell(0);'然后会抛出一个'NullPointerException'。因此,在进一步使用它之前,您需要检查'fromRow'是否为'null'。 –