如果 getCellType() 包含在 null 检查中,为什么我使用 getCellType() 会得到这个 NullPointerException?
Why do I get this NullPointerException with getCellType() if getCellType() is contained within a check for null?
我有一个 groovy 脚本,旨在将 Excel table 导出到降价文件。我遇到 getCellType() 抛出空指针异常的问题。
我已经尝试在两个地方测试单元格以查看它是否为空 - 在将单元格传递给调用 getCellType() 的方法之前,以及在方法本身内。我一次又一次地检查了我的逻辑,但我似乎无法找到我所缺少的东西。
我已经对其进行了测试,以确保该功能一直有效,直到发现空单元格为止,并且它似乎工作正常。它精确地按照我想要的方式循环 table,但最后抛出空指针异常。
注意:第一个 for 循环打印第一列,然后是第二个 for 循环,第二个 for 循环打印其下方的所有其他列,以防这样做的目的不清楚。
#!/usr/bin/env groovy
@Grab(group = 'org.apache.poi', module = 'poi', version = '4.1.0')
@Grab(group = 'org.apache.poi', module = 'poi-ooxml', version = '4.1.0')
import org.apache.poi.xssf.usermodel.XSSFWorkbook
import org.apache.poi.xssf.usermodel.*
import org.apache.poi.ss.usermodel.*
Workbook wb = new XSSFWorkbook(new File(this.args[0]))
DataFormatter formatter = new DataFormatter()
FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator()
PrintStream out = new PrintStream(new FileOutputStream(this.args[1]), true, "UTF-8")
Sheet sheet = wb.getSheetAt(0)
int lastRow = sheet.getLastRowNum()
static private void handleCell(Cell cell, FormulaEvaluator evaluator, DataFormatter formatter, PrintStream out){
if(cell != null){
CellValue cellValue = evaluator.evaluate(cell);
switch (cellValue.getCellType()) {
case CellType.BOOLEAN:
out.print("Cell: " + cellValue.getBooleanValue() + " Type: Boolean")
break;
case CellType.NUMERIC:
out.print("Cell: " + cellValue.getNumberValue() + " Type: Numeric")
break;
case CellType.STRING:
out.print("Cell: " + cellValue.getStringValue() + " Type: String")
break;
case CellType.BLANK:
out.print("Cell: BLANK Type: Blank")
break;
case CellType.ERROR:
break;
// CELL_TYPE_FORMULA will never happen
case CellType.FORMULA:
break;
}
}
}
for ( int r = 0 ; r <= lastRow ; r++ ){
cell = sheet.getRow(r).getCell(0)
if(cell.getCellType() != CellType.BLANK){
out.println(cell)
}
}
for ( int r = 0 ; r <= lastRow ; r++ ) {
boolean firstCell = true
int lastCol = sheet.getRow(r).getLastCellNum()
if ( r == 1){
for ( int c = 1 ; c <= lastCol ; c++){
if(firstCell){
out.print("| ")
}
out.print(" --- |")
firstCell = false
}
out.println()
}
firstCell = true
for( int c = 1 ; c <= lastCol ; c++ ){
Cell cell = sheet.getRow(r).getCell(c)
if(firstCell){
out.print("| ")
}
if(cell != null){
handleCell(cell, evaluator, formatter, out)
}
out.print(" | ")
firstCell = false
}
out.println()
}
错误信息:
Caught: java.lang.NullPointerException: Cannot invoke method getCellType() on null object
java.lang.NullPointerException: Cannot invoke method getCellType() on null object
at org.apache.poi.ss.usermodel.CellValue$getCellType.call(Unknown Source)
at excel2md.handleCell(excel2md.groovy:25)
at excel2md.run(excel2md.groovy:82)
Axel Richter
和 tim_yates
都根据上述评论发现了问题。空白单元格返回一个空 CellValue,它是抛出空指针异常的对象。我把方法内的测试条件改成if(cell.getCellType() != CellType.BLANK) 问题解决了
getcelltype
现已弃用,您应该改用 getCellTypeEnum
。
if (CellType.BLANK.equals(cellFour.getCellTypeEnum())) {
cellFour.setCellType(CellType.STRING);
}
我有一个 groovy 脚本,旨在将 Excel table 导出到降价文件。我遇到 getCellType() 抛出空指针异常的问题。
我已经尝试在两个地方测试单元格以查看它是否为空 - 在将单元格传递给调用 getCellType() 的方法之前,以及在方法本身内。我一次又一次地检查了我的逻辑,但我似乎无法找到我所缺少的东西。
我已经对其进行了测试,以确保该功能一直有效,直到发现空单元格为止,并且它似乎工作正常。它精确地按照我想要的方式循环 table,但最后抛出空指针异常。
注意:第一个 for 循环打印第一列,然后是第二个 for 循环,第二个 for 循环打印其下方的所有其他列,以防这样做的目的不清楚。
#!/usr/bin/env groovy
@Grab(group = 'org.apache.poi', module = 'poi', version = '4.1.0')
@Grab(group = 'org.apache.poi', module = 'poi-ooxml', version = '4.1.0')
import org.apache.poi.xssf.usermodel.XSSFWorkbook
import org.apache.poi.xssf.usermodel.*
import org.apache.poi.ss.usermodel.*
Workbook wb = new XSSFWorkbook(new File(this.args[0]))
DataFormatter formatter = new DataFormatter()
FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator()
PrintStream out = new PrintStream(new FileOutputStream(this.args[1]), true, "UTF-8")
Sheet sheet = wb.getSheetAt(0)
int lastRow = sheet.getLastRowNum()
static private void handleCell(Cell cell, FormulaEvaluator evaluator, DataFormatter formatter, PrintStream out){
if(cell != null){
CellValue cellValue = evaluator.evaluate(cell);
switch (cellValue.getCellType()) {
case CellType.BOOLEAN:
out.print("Cell: " + cellValue.getBooleanValue() + " Type: Boolean")
break;
case CellType.NUMERIC:
out.print("Cell: " + cellValue.getNumberValue() + " Type: Numeric")
break;
case CellType.STRING:
out.print("Cell: " + cellValue.getStringValue() + " Type: String")
break;
case CellType.BLANK:
out.print("Cell: BLANK Type: Blank")
break;
case CellType.ERROR:
break;
// CELL_TYPE_FORMULA will never happen
case CellType.FORMULA:
break;
}
}
}
for ( int r = 0 ; r <= lastRow ; r++ ){
cell = sheet.getRow(r).getCell(0)
if(cell.getCellType() != CellType.BLANK){
out.println(cell)
}
}
for ( int r = 0 ; r <= lastRow ; r++ ) {
boolean firstCell = true
int lastCol = sheet.getRow(r).getLastCellNum()
if ( r == 1){
for ( int c = 1 ; c <= lastCol ; c++){
if(firstCell){
out.print("| ")
}
out.print(" --- |")
firstCell = false
}
out.println()
}
firstCell = true
for( int c = 1 ; c <= lastCol ; c++ ){
Cell cell = sheet.getRow(r).getCell(c)
if(firstCell){
out.print("| ")
}
if(cell != null){
handleCell(cell, evaluator, formatter, out)
}
out.print(" | ")
firstCell = false
}
out.println()
}
错误信息:
Caught: java.lang.NullPointerException: Cannot invoke method getCellType() on null object
java.lang.NullPointerException: Cannot invoke method getCellType() on null object
at org.apache.poi.ss.usermodel.CellValue$getCellType.call(Unknown Source)
at excel2md.handleCell(excel2md.groovy:25)
at excel2md.run(excel2md.groovy:82)
Axel Richter
和 tim_yates
都根据上述评论发现了问题。空白单元格返回一个空 CellValue,它是抛出空指针异常的对象。我把方法内的测试条件改成if(cell.getCellType() != CellType.BLANK) 问题解决了
getcelltype
现已弃用,您应该改用 getCellTypeEnum
。
if (CellType.BLANK.equals(cellFour.getCellTypeEnum())) {
cellFour.setCellType(CellType.STRING);
}