我正在使用Apache POI的getStringCellValue()
尝试从xlsx文件中读取并获取数据。根据数据,我将继续做不同的事情。
如果重要的话,我还使用cellIterator
来迭代每一行的单元格。
由于完整的代码很复杂(与SO上的选项卡有关的格式有点糟糕(,这是一个总结版本:
Iterator<Cell> cellIterator = Row.cellIterator();
while(cellIterator.hasNext()){
Cell cell = cellIterator.next();
theColumnIndex = cell.getColumnIndex();
switch (theColumnIndex) {
case 0:
String value = cell.getStringCellValue();
System.out.println("Hello World");
//.....do more stuffs...
break;
case 1:
//...etc...
}
}
为什么对于相同类型的细胞,getStringCellValue()
的返回数据差异很大?我试图读取一个(看似?(blank/null/nempt/nothing单元格,有时它会跳过读取该单元格,但有时它会将该单元格读取为具有有效值。
使用上面的示例代码,有时Hello World
会被打印出来,有时不会,这取决于正在读取的空白单元格,导致它的因素对我来说是个谜
在大多数情况下,我预计任何空白单元格都会跳过整个部分(即Hello World
不会打印(
编辑
尝试查看Apache POI的Row
定义,我看到并编译了这些(数据文件中的D列是根据行的不同可能是空白单元格也可能不是空白单元格的列之一(:
<main:c r="D5" s="5"/>
<main:c r="D6" s="5"/>
<D15 does not exist?>
<D17 does not exist?>
<main:c r="D19" s="30"/>
<main:c r="D22"/>
据我所知,无论单元格是否为空,如果在相应的Row
对象中如上所述定义,它都将被读取。第15行和第17行没有定义它们的D列,所以它们没有被读取。
通过阅读这些文件,他们对细胞是如何";定义的";(我有选择了"清除所有格式"选项的空白单元格,该选项仍在定义中(,我认为这会导致上面的结果。
如果单元格没有包含String
或返回字符串的公式,方法getStringCellValue
将抛出异常:
以字符串形式获取单元格的值对于数值单元格,我们抛出一个异常。对于空白单元格,我们返回一个空字符串对于不是字符串公式的formulaCells,我们抛出一个异常。
您应该使用getCellType
来知道单元格是否为空,并最终知道保留值的正确类型:
返回单元格类型。
它返回一个具有以下可能值之一的CellType
:
- _NONE
- 空白
- 错误
- 公式
- 数字
- 字符串