我正在尝试使用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的单元格时,它不会打印任何内容,因此我认为我没有正确访问它。
如果我们都知道是什么代码行号导致了异常,那就太好了。
我怀疑是你的第一行代码造成的。对象单元格可以为null,并且null地址不能转换为字符串类型。您可以通过代码进行检查。
注意:代码与Office 2010配合使用很好,但我认为这类问题在任何Excel版本中都可能发生。
最好评估单元格类型,然后做你需要的事情。我使用此代码来处理单元格数据(检查我是否处理空白单元格):
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;
}
可能您在空白单元格中读取的原因是使用Apache POI的正确子组件来读取Excel文件。XLS格式使用HSSF(可怕的电子表格格式),XLSX格式使用XSSF(XML电子表格格式)。
至于代码本身,您可能需要改进您的布尔表达式。您现在的方式,因为您使用的是或运算符(||
),
str!=空
,和if语句的第一部分将在调用Double时抛出NumberFormatException。parseDoubleif
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
}
要了解有关单元格的更多信息,请阅读其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。 但是,我在阅读合并单元格时遇到了困难。我需要的是得到如图所示的红色高亮显示的内容。