如何在Java中读取包含空值的Excel单元格。。。?

如何在Java中读取包含空值的Excel单元格。。。?,java,apache,excel,apache-poi,Java,Apache,Excel,Apache Poi,我正在使用ApachePOI3.6。我有一列是空白的。我希望能够阅读它,然后转到下一个专栏。即使我可以解决NullPointerException问题,我也无法到达下一个单元格 以下是我的代码片段: HSSFCell cell = row.getCell(c); String value = null; switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_FORMULA: value = "FORMULA val

我正在使用ApachePOI3.6。我有一列是空白的。我希望能够阅读它,然后转到下一个专栏。即使我可以解决
NullPointerException
问题,我也无法到达下一个单元格

以下是我的代码片段:

HSSFCell cell = row.getCell(c);
String value = null;

switch (cell.getCellType()) {

    case HSSFCell.CELL_TYPE_FORMULA:
        value = "FORMULA value=" + cell.getCellFormula();
        break;

    case HSSFCell.CELL_TYPE_NUMERIC:
        value = "NUMERIC value=" + cell.getNumericCellValue();
        break;

    case HSSFCell.CELL_TYPE_STRING:
        value = "STRING value=" + cell.getStringCellValue();
        break;

    case HSSFCell.CELL_TYPE_BLANK:
        value="";
        break;

    case HSSFCell.CELL_TYPE_ERROR:
        value="error";
        break;

    default:
        break;
}

System.out.println("CELL col=" + cell.getColumnIndex() + " VALUE=" + value);

如何解决我的问题?

您需要检查一下是否有
单元格=null
,因为如果一行中不存在单元格,
row.getCell(c)
返回
null

那么,您可以在switch语句之前检查null,也可以更改对row.getCell的调用。检查Javadoc中的POI有两种形式,第一种是您正在使用的,第二种是一个额外的参数,类型为Row.MissingCellPolicy,您可以在其中传递一个值,该值将自动将空单元格转换为空白。

我终于得到了我想要的。谢谢你。 我想分享要更改的确切代码段。 只需更换以下线路:

HSSFCell cell = row.getCell(c);

试试这个

List cellDataList = new ArrayList();
XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream);

                        XSSFSheet sheet = workbook.getSheetAt(0);

                        Iterator rows = sheet.rowIterator();

                        int number=sheet.getLastRowNum();


                        int lineNumber = 0;

                        while (rows.hasNext())

                        {
                            XSSFRow row = ((XSSFRow) rows.next());
                            lineNumber++;
                            if(lineNumber==1){continue;}




                            Iterator cells = row.cellIterator();
                            List cellTempList = new ArrayList();    
                            int current = 0, next =1;
                            while(cells.hasNext())

                            {

                                XSSFCell cell = (XSSFCell) cells.next();


                                current = cell.getColumnIndex();


                                if(current<next){

                                }
                                else{

                                    int loop = current-next;

                                    for(int k=0;k<loop+1;k++){

                                        cellTempList.add(null);
                                        next = next + 1;
                                    }
                                }
                                switch (cell.getCellType()) {
                                            case Cell.CELL_TYPE_STRING:
                                                System.out.println(cell.getRichStringCellValue().getString());
                                                cellTempList.add(cell.getRichStringCellValue().getString());
                                                break;
                                            case Cell.CELL_TYPE_NUMERIC:                                                    
                                                    System.out.println(cell.getNumericCellValue());
                                                    cellTempList.add(String.valueOf(cell.getNumericCellValue()));                                                   
                                                break;
                                            case Cell.CELL_TYPE_BOOLEAN:
                                                System.out.println(cell.getBooleanCellValue());
                                                break;
                                            case Cell.CELL_TYPE_FORMULA:
                                                System.out.println(cell.getCellFormula());
                                                cellTempList.add(cell.getCellFormula());
                                                break;                                              

                                            default:
                                                System.out.println("Inside default");
                                }
                                next = next + 1;

                            }
                            cellDataList.add(cellTempList); 
                         }
List cellDataList=newarraylist();
XSSF工作簿=新XSSF工作簿(fileInputStream);
XSSFSheet sheet=workbook.getSheetAt(0);
迭代器行=sheet.rowIterator();
int number=sheet.getLastRowNum();
int lineNumber=0;
while(rows.hasNext())
{
XSSFRow行=((XSSFRow)rows.next());
lineNumber++;
如果(行号==1){continue;}
迭代器单元格=行。单元格迭代器();
List celltemplast=newarraylist();
int current=0,next=1;
while(cells.hasNext())
{
XSSFCell cell=(XSSFCell)cells.next();
当前=cell.getColumnIndex();

如果(当前谢谢你,文卡特,除了
对于使用Apache 4.0.0及更高版本的用户,他们需要按照以下方式进行操作:

HSSFCell cell=row.getCell(c, org.apache.poi.ss.usermodel.Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);

由于“单元格”是一个对象,据我所知,无法使用“==”或“!=”运算符来获取值。不是吗?但是单元格实际上存在,但它有一个“空白”值,即没有值。您可以使用==或!=检查空值,这是您应该做的。单元格很可能不存在(在数据结构中),这就是出现NullPointerException问题的原因。
HSSFCell cell=row.getCell(c, org.apache.poi.ss.usermodel.Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);