【问题标题】:Store cell values to Object将单元格值存储到对象
【发布时间】:2019-03-08 11:11:18
【问题描述】:

我目前是使用 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;

【问题讨论】:

  • 抛出了一个异常,你会默默地忽略它。将e.printStackTrace(); 放入您的catch 块中,您将看到。
  • 嗨。谢谢@AxelRichter。我没有注意到,谢谢这个提示..如果你不介意?请问我在将值存储到对象方面是否做对了:codetableArr[arrNo1][arrNo2] = cellValue;code 在启用堆栈跟踪后,它说 java.lang.NullPointerException 与此有关线。我试着打印出我的变量,它有值。抱歉打扰了。
  • Object[][] tableArr = new String[sheet.getLastRowNum() + 1][]; 之后,您认为Object[][] tableArr 的尺寸是多少?
  • @AxelRichter。我想我现在明白了,null 指的是对象的第二维。谢谢!
  • 正确。而且由于数组维度的静态行为,您应该更好地使用Collection。以List&lt;List&lt;String&gt;&gt; tableList 为例。

标签: automation apache-poi qa


【解决方案1】:

根据您的代码,

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 是否满足您的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多