1

我正在尝试使用 Apache POI 读取旧的(2007 年之前和 XLS)Excel 文件。我的程序走到行的末尾并向上迭代,直到找到既不是空也不是空的东西。然后它会重复几次并抓取这些单元格。该程序可以很好地阅读在 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是文档中最后一个不为空或不为空的单元格。当我尝试打印第一个不为空或 null 的单元格时,它什么也不打印,所以我认为我没有正确访问它。

4

3 回答 3

3

也许您在空白单元格中阅读的原因是由于使用了 Apache POI 的正确子组件来读取 Excel 文件。对 XLS 格式使用 HSSF(可怕的电子表格格式),对 XLSX 格式使用 XSSF(XML 电子表格格式)。


至于代码本身,您可能需要优化您的布尔表达式。您现在拥有它的方式,因为您使用的是 or 运算符 ( ||),

  • if 语句的第一部分将执行 if str != null,并且
  • if 语句的else一部分将执行 if str == null

if 语句的第一部分将NumberFormatException在调用Double.parseDoubleif 时抛出一个 if strcannot be parsed as a number。

也许以下代码片段会对您有所帮助:

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

于 2012-06-01T21:12:49.367 回答
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;
}
于 2012-06-01T21:41:27.247 回答
0

如果我们都知道是什么代码行号导致了异常,那就太好了。

我怀疑你的第一行代码是原因。对象单元格可以为空,空地址不能转换为字符串类型。您可以通过代码检查。

注意:该代码适用于 Office 2010 很好,但我认为此类问题可能发生在任何 Excel 版本中。

于 2012-06-01T21:17:58.980 回答