将单元格值存储到对象

时间:2019-03-08 11:11:18

标签: automation apache-poi qa

我目前不熟悉使用Java的TestNG。我正在尝试使用poi Apache 4.0从Excel读取值

    public static void read2dRowExcelFile2(String filePath) throws IOException {

    try {
        FileInputStream fis = new FileInputStream(new File(filePath));
        HSSFWorkbook wb = new HSSFWorkbook(fis);
        HSSFSheet sheet = wb.getSheet("PerLocation");

        Object[][] tableArr = new String[sheet.getLastRowNum() + 1][];
        int arrNo1 = 0;
        for (int i = 1; i <= sheet.getLastRowNum(); i++) {
            Row row = sheet.getRow(i);              
            int arrNo2 = 0;
            for (int j = 0; j < row.getLastCellNum(); j++) {
                String cellValue = row.getCell(j).getStringCellValue();
                System.out.println(acellValue);
                //tableArr[arrNo1][arrNo2] = cellValue;
                System.out.println("test");
                arrNo2++;
            }

            arrNo1++;
        }

        wb.close();

    } catch (Exception e) {
        e.printStackTrace();
    }
}
上面的

代码在控制台上显示值。我的目标是将这些值存储到对象。像[{London,Blue},{Tokyo,Yellow},{Manila,Red}]之类的东西,所以我可以将它们传递给dataProvider

如果我运行上面的代码,它将显示: 伦敦 蓝色 东京 黄色 马尼拉 红色

但是如果我取消注释此行:

//tableArr[arrNo1][arrNo2] = cellValue;

仅输出: 伦敦

03-08-19:启用堆栈跟踪后,它说:java.lang.NullPointerException 与此代码有关:

tableArr[arrNo1][arrNo2] = cellValue;

1 个答案:

答案 0 :(得分:0)

根据您的代码

Object[][] tableArr = new String[sheet.getLastRowNum() + 1][]; 

在数组初始化时,您正在设置第一维的大小,而不是第二维的大小。访问之前,您需要为第二维初始化数组。

请参考以下示例:

    public static void main(String[] args) {
        //read rows size
        int numOfRows = 3;
        String[][] tableArr = new String[numOfRows][];

        for (int row = 0; row <3; row++) {
            //read columns size
            int numOfColsInRow = 3;
            tableArr[row]=new String[numOfColsInRow];              
            for (int col = 0; col < 3; col++) {
                String cellValue = "cell-" + row+""+col;//read cell value
                tableArr[row][col] = cellValue;
            }
        }

        for(String[] row: tableArr) {
            System.out.println(Arrays.toString(row));
        }
    }

运行以上代码并生成预期输出:

[cell-00, cell-01, cell-02]
[cell-10, cell-11, cell-12]
[cell-20, cell-21, cell-22]

要重现您的问题,您可以尝试在注释行中初始化代码中第二维的数组,您将看到Exception in thread "main" java.lang.NullPointerException

        //tableArr[row]=new String[numOfColsInRow];              

为避免所有此类问题,您还可以检查退出的TestNG data-provider extension是否满足您的需求。