我正在尝试使用Apache POI读取旧的(2007年之前和XLS)Excel文件。我的程序到达行的末尾并重复迭代,直到找到不为null或为空的内容。然后它重复几次并抓取那些细胞。此程序可以很好地读取Office 2010中生成的XLSX和XLS文件。
我收到以下错误消息:
Exception in thread "main" java.lang.NumberFormatException: empty String
at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
at java.lang.Double.parseDouble(Unknown Source)
在这一行:
num = Double.parseDouble(str);
来自代码:
str = cell.toString();
if (str != "" || str != null) {
System.out.println("Cell is a string");
num = Double.parseDouble(str);
} else {
System.out.println("Cell is numeric.");
num = cell.getNumericCellValue();
}
其中cell
是文档中非空或空的最后一个单元格。当我尝试打印非空或空的第一个单元格时,它什么都不打印,所以我想我没有正确访问它。
答案 0 :(得分:3)
也许您正在读取空白单元格的原因是由于使用了正确的Apache POI子组件来读取Excel文件。对XLS格式使用HSSF(可怕的SpreadSheet格式),对XLSX格式使用XSSF(XML SpreadSheet格式)。
至于代码本身,您可能希望优化布尔表达式。你现在的方式,因为你正在使用或运算符(||
),
str != null
和else
部分将在str == null
。如果无法将NumberFormatException
解析为数字,则if语句的第一部分将在调用Double.parseDouble
时抛出str
。
以下代码段可能会对您有所帮助:
if (str == null || str.trim().isEmpty()) {
// handle null and empty strings
} else if (cell.getType() == Cell.CELL_TYPE_NUMERIC) {
System.out.println("Cell is numeric.");
num = cell.getNumericCellValue();
} else {
// If the cell is not numeric, Double.parseDouble(str)
// will most likely throw a NumberFormatException
}
要了解有关Cell
的更多信息,请阅读其Javadoc。
答案 1 :(得分:2)
评估细胞类型然后做你需要的更好。我使用此代码来处理单元格数据(检查我是否处理空白单元格):
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
str = cell.toString().trim();
break;
case Cell.CELL_TYPE_NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
//you should change this to your application date format
objSimpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
str = objSimpleDateFormat.format(cell.getDateCellValue());
} else {
num = cell.getNumericCellValue();
str = String.valueOf(cell.getNumericCellValue());
}
break;
case Cell.CELL_TYPE_BLANK:
str = "";
break;
case Cell.CELL_TYPE_ERROR:
str = "";
break;
case Cell.CELL_TYPE_BOOLEAN:
str = String.valueOf(cell.getBooleanCellValue());
break;
}
答案 2 :(得分:0)
如果我们都知道什么代码行号导致异常,那就太好了。
我怀疑你的第一行代码是原因。对象单元格可以为null,并且无法将空地址转换为String类型。您可以通过代码进行检查。
注意:代码适用于Office 2010,但我认为此类问题可能会在任何Excel版本中发生。