【问题标题】:Null pointer for blank columns and rows using Apache POI使用 Apache POI 的空白列和行的空指针
【发布时间】:2013-01-09 05:38:47
【问题描述】:

我需要有关反复出现的问题的帮助。早些时候我问了一个类似的问题,但得到了部分答案。问题here 问题是每次我想在没有任何数据或空白的行上写入时,我总是会遇到空指针错误问题。我的临时解决方案是用数据填充这些行,这样我就可以在每一列上写一些东西。一位帮助我的志愿者给出的解决方案也只是暂时的。我对我的代码做了一些改动(如下)。 空指针错误指向带有双星号的行。

public void writeSomething(XSSFWorkbook wb){
        for (String elem: listOfSheetNames){
            if (elem.equals("Sheet2")){

                sheet = wb.getSheet(elem);
                XSSFRow row = sheet.getRow(2);
                **XSSFCell cell = row.getCell(3, Row.CREATE_NULL_AS_BLANK );

                if (cell.getCellType() == Cell.CELL_TYPE_BLANK){
                    cell = row.createCell(3);
                    cell.setCellType(Cell.CELL_TYPE_STRING);
                    cell.setCellValue("this was blank");
                }
            }
        }
    }

我继续研究这个问题,我看到他们正在使用 MissingCellPolicy 指示 here 我继续尝试该代码但它不起作用所以我检查了 Apache Docs 并且他们有 Row.Create_Null_as_Blank 但我不确定它是否与 MissingCellPolicy.Create_Null_as_Blank 相同,或者后者只是在以前的 poi 版本中使用。尽管这应该解决了有关空白列或行的问题。我仍然收到空指针异常错误。如果这有帮助,我正在使用 Apache poi 3.9 版。非常感谢任何帮助。谢谢

更新 1

我使用 jims 解决方案更新了我的代码。我添加了一个方法来检查一行是否存在。但我仍然有两个星号的相同错误显示。这是我的代码:

public void writeSomething(XSSFWorkbook wb){
        for (String elem: listOfSheetNames){
            if (elem.equals("Sheet2")){
                int y=1;
                sheet = wb.getSheet(elem); 
                XSSFRow row = null; //create row variable outside if scope

                if (isRowEmpty(sheet.getRow(4))== false){
                    row = sheet.createRow(4);
                }   

                **XSSFCell cell = row.getCell(y, Row.CREATE_NULL_AS_BLANK );

                if (cell.getCellType() == Cell.CELL_TYPE_BLANK){
                    cell = row.createCell(y);
                    cell.setCellType(Cell.CELL_TYPE_STRING);
                    cell.setCellValue("Hooooy this was blank");
                }

            }
        }
    }

isRowEmpty

​​>
public boolean isRowEmpty(Row row){

        if (row == null){
            return true;
        }
        else {
            return false;
        }
    }

更新 2

我为我的代码找到了一种解决方法,以防有人发现它有用。我没有使用 row.getCell 因为我总是遇到 NUll 指针错误。见下面的代码

public void writeSomething(XSSFWorkbook wb){
        for (String elem: listOfSheetNames){
            if (elem.equals("Sheet2")){
                int y=1; //sets column number
                sheet = wb.getSheet(elem); 
                XSSFRow row = null; //create row variable outside if scope

                if (isRowEmpty(sheet.getRow(19))== false){
                    row = sheet.createRow(19);
                    XSSFCell cell = row.createCell(y);
                    cell.setCellType(Cell.CELL_TYPE_STRING);
                    cell.setCellValue("Hooooy this was blank");
                }   

            }
        }
    }

【问题讨论】:

  • 通过使用以下代码获取值并进行空检查stackoverflow.com/a/12529872/1211000
  • 您好,我只是想知道如何添加这些代码行。因为我需要先声明 XSSFCell cell = row.getCell... 然后检查单元格类型。但是当我声明 XSSFCell 单元格时代码停止运行,因此无法检查它包含的单元格类型。
  • 使用我发布的链接中的 getCellValue(row.getCell(3) 方法//它返回字符串,检查是否为空。不需要再次包含 wat 单元格
  • 行也可以为空!您确定您使用的行存在吗?
  • 嗨 gagravarr 我相信该行也不存在,所以我会尝试 Jims 解决方案。谢谢

标签: java apache-poi


【解决方案1】:

如果您需要的单元格不存在,您必须使用 创建

HSSFRow.createCell(int columnIndex, int type) 

同样,如果该行不存在,则创建它

HSSFSheet.createRow(int rownum)

XSSF 也有相同的方法。

【讨论】:

  • 嗨,吉姆,感谢您的回答。我只是想知道您使用的是什么版本的 Apache POI,因为我使用的是 3.9 版。我找不到 HSSFSHeet.createRow(int) 方法。
  • 嗨吉姆,谢谢我找到了。我只是忘了回答我自己的问题。但是我已经编辑了我的代码,如上所示,错误仍然存​​在。感谢您的宝贵时间
  • 实际上是在尝试创建第 4 行和 y=1 的单元格 1。我有这个 XSSFCell cell = row.getCell(y, Row.CREATE_NULL_AS_BLANK) 的来源
  • isRowEmpty()的定义是什么?你确定它符合你的预期吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多