簡體   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