当前位置: 首页 > 知识库问答 >
问题:

使用Apache POI从Excel读取单元格中的问题

翁俊良
2023-03-14

我正在尝试使用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是文档中最后一个不为空或null的单元格。当我尝试打印第一个不为空或null的单元格时,它不会打印任何内容,因此我认为我没有正确访问它。

共有3个答案

邹博裕
2023-03-14

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

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

注意:代码与Office 2010配合使用很好,但我认为这类问题在任何Excel版本中都可能发生。

俞飞鸣
2023-03-14

最好评估单元格类型,然后做你需要的事情。我使用此代码来处理单元格数据(检查我是否处理空白单元格):

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;
}
蒋航
2023-03-14

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

至于代码本身,您可能需要改进您的布尔表达式。您现在的方式,因为您使用的是或运算符(||),

  • if语句的第一部分将执行ifstr!=空,和

if语句的第一部分将在调用Double时抛出NumberFormatException。parseDoubleifstr不能解析为数字。

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

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
}

要了解有关单元格的更多信息,请阅读其Javadoc。

 类似资料:
  • 问题内容: 我正在尝试使用Apache POI读取旧的(2007年前和XLS前)Excel文件。我的程序转到行的末尾并进行迭代,直到找到不为null或为空的值。然后迭代回去几次并获取这些单元格。该程序可以很好地读取Office 2010中制作的XLSX和XLS文件。 我收到以下错误消息: 在行: 从代码: 其中是文档中最后一个不为空或为null的单元格。当我尝试打印不为空或为null的第一个单元格

  • 我有一个巨大的excel文件,其中包含大量列,如下所示:- 当我打印excel中的所有值时,我的代码生成的输出是:- 所以,如果我们看看上面的输出,我们可以注意到我留下空白值的单元格没有被POI库拾取。有没有一种方法可以让这些值为空?还是一种识别所呈现的值跳过空白单元格的方法? 请注意:我使用的不是usermodel(org.apache.poi.ss.usermodel),而是一个事件API来处

  • 问题内容: 我有包含多个工作表的Excel文件,每个工作表看起来都像这样(但更长): 第一列实际上是四个垂直合并的单元格。 当我使用pandas.read_excel阅读此内容时,我得到一个看起来像这样的DataFrame: 如何让Pandas理解合并的单元格,或者快速方便地删除NaN并按适当的值分组?(一种方法是重置索引,逐步查找值并将NaN替换为值,传入天数列表,然后将索引设置为该列。但是似乎

  • 问题内容: 当我读取excel数字单元格值时,我得到带小数的输出。例如:79读数为79.0,0.00读数为0.0。我编写的应用程序代码是: 问题答案: Stack Overflow上经常出现这个问题,因此建议您仔细阅读许多类似的问题,以找到答案! Excel将文件格式中的几乎所有数字都存储为浮点值,这就是为什么POI会为您返回数字单元格的双精度数字,因为这就是真正的数字。如果希望它看起来像在Exc

  • 背景:我正在尝试将Excel文件读入Java程序。我的Excel文件的意思是表示一个网格或栅格地图,所以我使每个单元格的高度和宽度为一英寸。我的想法是,我可以“绘制”一个地图或图像,通过阴影在每个单元格与一个颜色。然后,我可以将Excel文件读到一个我自己用“Pixel”对象创建的Java程序,并创建一个更文字化的图像。我是计算机科学的本科生,到目前为止我只上过四节计算机科学课。我懂OOP,能用J

  • 我正在构建一个函数,读取excel文件中可用的数据。 我在Spring项目中使用Apache POI。 但是,我在阅读合并单元格时遇到了困难。我需要的是得到如图所示的红色高亮显示的内容。