我正在尝试将Apache POI用于Java中的excel读写操作。当我尝试传递excel中没有任何数据的单元格时,预计会返回空白,但是-抛出了Java Null指针异常。但是,当我传递具有某些数据的单元格时,getCelldata和setCelldata方法都可以正常工作。
这是代码片段

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
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;
import org.apache.poi.ss.usermodel.Row;

    public class ExcelUtils {
                private static XSSFSheet ExcelWSheet;
                private static XSSFWorkbook ExcelWBook;
                private static XSSFCell xCell;
                private static XSSFRow xRow;

            //This method is to set the File path and to open the Excel file, Pass Excel Path and Sheetname as Arguments to this method

            public static void setExcelFile(String Path,String SheetName) throws Exception {
                try {

                    // Access the required test data sheet
                    FileInputStream inputStream = new FileInputStream(new File(Path));
                    ExcelWBook = new XSSFWorkbook(inputStream);
                    ExcelWSheet = ExcelWBook.getSheet(SheetName);
                    } catch (Exception e){
                        throw (e);
                    }
            }

            //This method is to read the test data from the Excel cell, in this we are passing parameters as Row num and Col num

            public static String getCellData(int RowNum, int ColNum) throws Exception{
                try{
                    xCell = ExcelWSheet.getRow(RowNum).getCell(ColNum, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
                    String CellData = xCell.getStringCellValue();
                    return CellData;
                    }catch (Exception e){
                        throw(e);
                    }
            }

            //This method is to write in the Excel cell, Row num and Col num are the parameters

            public static void setCellData(String Result,  int RowNum, int ColNum) throws Exception {

                try{
                    xRow  = ExcelWSheet.getRow(RowNum);
                    xCell = xRow.getCell(ColNum, Row.MissingCellPolicy.RETURN_BLANK_AS_NULL);
                    if (xCell == null) {
                        xCell = xRow.createCell(ColNum);
                        xCell.setCellValue(Result);
                        } else {
                            xCell.setCellValue(Result);
                        }
          // Constant variables Test Data path and Test Data file name

                        FileOutputStream fileOut = new FileOutputStream(Constants.Path_TestData);
                        ExcelWBook.write(fileOut);
                        fileOut.flush();
                        fileOut.close();
                        }catch(Exception e){
                            throw (e);
                    }
                }
    }


在行上抛出错误,但由于我提供了MissingCellPolicy,因此预期xCell应该具有空白值

xCell = ExcelWSheet.getRow(RowNum).getCell(ColNum, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);




xCell = xRow.getCell(ColNum, Row.MissingCellPolicy.RETURN_BLANK_AS_NULL);


提前致谢

最佳答案

可能您正在传递一个完全空的行,这就是为什么您的getRow()方法失败并为您提供NullPointerException的原因。

当您遍历行中的列时,某些空白单元格甚至可能不存在,这可能导致毫无疑问的代码引发NullPointerException。 MissingCellPolicy,仅应用于单元。所以你不能把整行都留空

CREATE_NULL_AS_BLANK-如果返回的单元格不存在,而不是返回null,请创建一个单元格类型为“空白”的新Cell。这可以帮助您方便地避免NullPointerExceptions。

RETURN_BLANK_AS_NULL-即使该单元格存在但单元格类型为“空白”,也应返回null。这可以让您忽略确实存在的空白单元格。

RETURN_NULL_AND_BLANK-不要修改现有结构;对于不存在的单元格,返回null;如果存在空白单元格,但其单元格类型为空,则返回空白单元格。这是getCell重载的行为,它不会占用MissingCellPolicy。

09-12 03:59