使用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;
    }

後言

當然,該方法不是一個很好的方法,有些還有些特殊情況處理不了。
如果你有什麼改進或者更好的方法,歡迎留言。

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