使用POI读取Excel表格中数据

使用POI读取Excel表格中数据

已经在 使用POI读取Excel表格中数据2优化。(https://blog.csdn.net/qq_36570464/article/details/107053355)

https://blog.csdn.net/qq_36570464/article/details/107053355

背景

自己最近在研究自动换测试,在进行参数化时候,会对把用例写在Excel表格中,然后通过Java来取表格中数据,进而进行参数化。

问题

那么,我们的表格可能回事这么一个情况:

在这里插入图片描述

表格中的单元格里出现没有输入的情况(图片中红色部分),如何通过POI进行读取,或者如何处理?预期结果不用考虑。

代码

只贴了获取表格中数据代码,其他不是本文内容。


    @DataProvider
    public Object[][] getParamExcel() throws IOException {
        File file = new File("/param.xlsx");
        XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(file));
        //获得表格中的第0个Sheet
        XSSFSheet sheet = workbook.getSheetAt(0);
        //得到有多少行
        int numberRows = sheet.getPhysicalNumberOfRows();
        //获得第一行有多少列
        int numberCells=sheet.getRow(0).getPhysicalNumberOfCells();
         //获得第一行第一列所在的位置
        int numberFirst = sheet.getRow(0).getFirstCellNum();
        //创建一个Object二维数组,用来作为参数返回。
        //因为第一行是说明,则跳过第一行,所以行数减一
        Object[][] data = new Object[numberRows - 1][];
        //创建一个保存列的对象
        XSSFRow row = null;
        // 因为第一行是说明,则跳过第一行,所以行数减一
        //sheet.getFirstRowNum() 获得第一行开始的位子,可能不从第一行开始(i=0)
       //numberRows - 1 表示除去第一行说明,实际数据有多少行
        for (int i = sheet.getFirstRowNum(); i < numberRows - 1; i++) {
            //得到第i+1行,即第二行的实际数据
            row = sheet.getRow(i + 1);
            // 创建一个字符数组,用来保存一行中,每一列的数据
            String[] strings = new String[numberCells];
            //row.getFirstCellNum() 获得一行中实际数据所在列,不一为第一列,如图第4行
            for (int j = numberFirst; j < numberCells; j++) {
                // 数据是通过key-value方式保存,遍历是会出现空指针异常(图中红色部分)。
                //出现的多余没有输入的单元格会出现异常,并对没有数据输入的单元格(红色部分)是进行空字符处理
                try {
                    //设置为字符类型,这里主要是因为在获取Excel数据时,
                    //数字出现小数点,主要用于不加小数点,可以简单这么理解。大家可以看一下源码就知道什么原因了
                    row.getCell(j).setCellType(CellType.STRING);
                } catch (NullPointerException e) {
                   //出现空指针异常,说明数据没有输入,即空数据,做空字符串处理
                    strings[j] = "";
                   //跳过当前循环
                    continue;
                }
               // 保存数据
                strings[j] = row.getCell(j).getStringCellValue();
            }
            //把获得数据添加到data
            data[i] = strings;
        }
        return data;
    }

后言

当然,该方法不是一个很好的方法,有些还有些特殊情况处理不了。
如果你有什么改进或者更好的方法,欢迎留言。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章