基於Java+Selenium的WebUI自動化測試框架(十二)-----讀取Excel文件(POI)(2)


  上一篇我們講了怎么利用Java的反射機制,將Excel的讀取到的數據,賦值給我們構造函數中定義的變量。

  接下來就簡單了,我們將實際實現這個讀取的簡單過程。來看下面一段代碼。

private static <T> List<T> transToObject(Class<T> clz,Workbook xssfWorkbook, String sheetName)
            throws InstantiationException, IllegalAccessException,
            InvocationTargetException {
        List<T> list = new ArrayList<T>();
        Sheet xssfSheet = xssfWorkbook.getSheet(sheetName);
        Row firstRow = xssfSheet.getRow(0);
        if(null ==firstRow){
            return list;
        }
        List<Object> heads = getRow(firstRow);
        //添加sheetName字段,用於封裝至bean中,與bean中的字段相匹配。
        heads.add("sheetName");
        Map<String, Method> headMethod = getSetMethod(clz, heads);
        for (int rowNum = 1; rowNum <= xssfSheet.getLastRowNum(); rowNum++) {
            try {
                Row xssfRow = xssfSheet.getRow(rowNum);
                if (xssfRow == null) {
                    continue;
                }
                T t = clz.newInstance();
                List<Object> data = getRow(xssfRow);
                //如果發現表數據的列數小於表頭的列數,則自動填充為null,最后一位不動,用於添加sheetName數據
                while(data.size()+1<heads.size()){
                    data.add("");
                }
                data.add(sheetName);
                setValue(t, data, heads, headMethod);
                list.add(t);
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return list;
    }

  在這段代碼中,我們使用了一個泛型Class<T>來指代我們的構造類,返回的就是一個包含這個構造類的實例集合List<T>。

  另外,xssfWorkbook 是POI中指代一個Excel workbook的變量,sheetName就是我們要讀取的sheet名字。

  這里使用了一個小技巧,就是我們的構造函數中,並沒有包含sheetName這樣一個變量,但是我們實際讀取Excel的時候,每個被讀取的值都是在一個sheet上的,這樣也就必然會有一個sheetName的屬性。我們獲取第一列的列名之后,可以把“sheetName”這個字段加入List集合中。

  在賦值的時候,我們把參數當中的sheetName賦值給“sheetName”字段,這樣,作為一個返回的構造類實例,就包含了變量“sheetName”及具體值sheetName。

  下面,我們再對xssfWorkbook進行再定義,請看下面一段代碼:

    public static <T> List<T> readExcel(Class<T> clz, String path,String sheetName) {
        if (null == path || "".equals(path)) {
            return null;
        }
        InputStream is;
        Workbook xssfWorkbook;
        try {
            is = new FileInputStream(path);
       //判斷Excel的版本。因為Excel版本不一樣,文件的后綴名也不一樣
if (path.endsWith(".xls")) { xssfWorkbook = new HSSFWorkbook(is); } else { xssfWorkbook = new XSSFWorkbook(is); } is.close(); return transToObject(clz, xssfWorkbook, sheetName); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("轉換excel文件失敗:" + e.getMessage()); } }

  這樣,我們就完成了一個自定義的構造類----“按需讀取”Excel的過程。

  在這個過程中,我們需要注意:構造類中的變量名和Excel文件中記錄的列名要保持一致,我們才能正常讀取數據。

  擴展一下,假如我要讀取Excel和N個sheet上的數據,並且也要“按需讀取”。怎么辦呢。例如:

Excel有2個Sheet,SheetA和SheetB,這兩頁上分別寫有不同的元素,我想把這些頁面元素的內容都讀出來,作為一個集合List<T>返回

SheetA------頁面元素A1(網頁名,名稱,尋找方式,等待時間,路徑),SheetA------頁面元素A2(網頁名,名稱,尋找方式,等待時間,路徑)

SheetB------頁面元素B1(網頁名,名稱,尋找方式,等待時間,路徑),SheetB------頁面元素B2(網頁名,名稱,尋找方式,等待時間,路徑)

  我們來看下面一段代碼:

    public static <T> List<T> readExcel(Class<T> clz, String path) {
        System.out.println(path);
        if (null == path || "".equals(path)) {
            return null;
        }
        InputStream is;
        Workbook xssfWorkbook;
        try {
            is = new FileInputStream(path);
            if (path.endsWith(".xls")) {
                xssfWorkbook = new HSSFWorkbook(is);
            } else {
                xssfWorkbook = new XSSFWorkbook(is);
            }
            is.close();
            int sheetNumber = xssfWorkbook.getNumberOfSheets();
            List<T> allData = new ArrayList<T>();
            for (int i = 0; i < sheetNumber; i++) {
                allData.addAll(transToObject(clz, xssfWorkbook,
                        xssfWorkbook.getSheetName(i)));
            }
            return allData;
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("轉換excel文件失敗:" + e.getMessage());
        }
    }

  這里還是比較好處理的,只要直接遍歷每個Sheet再存儲就好了。

  實際使用例子:

  

    public static void main(String[] args) {
        String excelpath = ".\\case-data\\same4Test.xls";
        List<positionBean> dataList = new ArrayList<positionBean>();
        dataList = excelUtil.readExcel(positionBean.class,excelpath,"Sheet1");
        for(int i = 0; i < dataList.size();i++) {
            String pageName = dataList.get(i).getPageName();
            String path = dataList.get(i).getPath();
            int waitSec = dataList.get(i).getSec();
            String type = dataList.get(i).getType();
            String positionName = dataList.get(i).getPositionName();
            System.out.println(pageName);
            System.out.println(path);
            System.out.println(waitSec);
            System.out.println(type);
            System.out.println(positionName);
        }
    }

  這樣我們就真正完成了使用POI實現“按需讀取”

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM