繁体   English   中英

使用 Apache POI 时出现 java.lang.NullPointerException

[英]I am getting a java.lang.NullPointerException when using Apache POI

当我运行我的代码时,我收到一个异常,说工作表是 null,即使当我在 excel 中打开工作表时,这些单元格中有明显的值。

点击查看 excel 文件的图片

这是异常:错误 StatusLogger Log4j2 找不到日志记录实现。 请将 log4j-core 添加到类路径中。 Using SimpleLogger to log to the console... Exception in thread "main" java.lang.NullPointerException: Cannot invoke "org.apache.poi.xssf.usermodel.XSSFSheet.getLastRowNum()" because "sheet" is null at excelOperations. readExcel.main(readExcel.java:20) PS C:\Users\noobe\Downloads\VSCODE\ReadExcelFile>

package excelOperations;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class readExcel {
    public static void main(String[] args) throws FileNotFoundException{

    String excelFilePath = "C://Users//noobe//Downloads//test.xlsx";
    FileInputStream inputStream = new FileInputStream(excelFilePath);

    XSSFWorkbook workbook = new XSSFWorkbook();
    XSSFSheet sheet = workbook.getSheetAt(0);
    
    int rows=sheet.getLastRowNum();
    int cols =sheet.getRow(1).getLastCellNum();

    for(int r=0 ; r<rows;r++){
        XSSFRow row = sheet.getRow(r);
        for(int c=0; c<=cols;c++){
            XSSFCell cell=row.getCell(c);
            switch(cell.getCellType()){
                case STRING: System.out.print(cell.getStringCellValue()); break;
                case NUMERIC: System.out.print(cell.getNumericCellValue());break;
                case BOOLEAN: System.out.print(cell.getBooleanCellValue());break;

            }
            System.out.print(" | ");
        }
        System.out.println();
    }
}
}

当您尝试使用尚未创建的变量或 object 执行操作时,将引发 NullPointerException。 您可以在此处找到一些附加信息: 什么是 NullPointerException,以及如何修复它?

特别是在您的情况下,您已经创建了一个新的XSSFWorkbook()但您尚未将文件加载到其中(您声明的 inputStream 被完全忽略),因此它不会有任何数据/内容可供读取,这就是为什么你得到错误。

简单的解决方案是更改您现有的生产线:

XSSFWorkbook workbook = new XSSFWorkbook();

而是使用文档中显示的构造函数之一,该构造函数接受您要加载的文档作为输入。 您很幸运,可以将 FileInputStream 直接传递给构造函数,如下所示:

XSSFWorkbook workbook = new XSSFWorkbook(inputStream);

我还建议您在任何时候对工作表、行、单元格等使用get方法时进行 null 检查,因为通常一个空白单元格会给出 null 结果,但可以轻松检查

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM