簡體   English   中英

使用testNG讀取硒中的Excel數據

[英]Reading excel data in selenium with testNG

我是Selenium的新手,仍然在學習。 我試圖用兩個測試在TestNG中編寫一個程序,以從Excel讀取數據並使用Apache POI進行編寫。 我在同一文件夾中有一個XLS和一個XLSX文件,並嘗試使用這兩個文件。 我正在嘗試在testng.xml中配置Excel的路徑和名稱。 當我執行第一個測試以讀取數據時,工作表名稱被讀取為xml。 下面是我的testng.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="tests" thread-count="2">
<parameter name="filePath" value="C:\\Technologies\\Selenium\\WebDriver\\DataFiles\\ExcelFiles"></parameter>
  <test name="Xlsx">
  <parameter name="fileName" value="12142015_sx.xlsx"></parameter>
  <parameter name="sheetName" value="xlsx_1"></parameter>
    <classes>
      <class name="handlefiles.handleExcel"/>
    </classes>
  </test>
  <test name="Xls">
  <parameter name="fileName" value="12142015_s.xls"></parameter>
  <parameter name="sheetName" value="xls_1"></parameter>
    <classes>
      <class name="handlefiles.handleExcel"/>
    </classes>
  </test> <!-- Test -->
</suite> <!-- Suite -->

下面是Java類代碼。

package handlefiles;

import java.io.*;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.testng.annotations.*;

public class handleExcel {

    @BeforeTest
    @Parameters({"filePath", "fileName", "sheetName"})
    public void readExcel(String filePath, String fileName, String sheetName) throws IOException{
        // set the file path
        File eFile = new File(filePath+"\\"+fileName);
        //print the file path
        System.out.println("File is at: "+eFile);

        FileInputStream inputstream = new FileInputStream(eFile);
        Workbook wb = null;

        // Read and publish extension
        String extensionName = fileName.substring(fileName.indexOf("."));
        System.out.println("File type is: "+extensionName);

        //Read the file
        if(extensionName.equalsIgnoreCase(".xlsx")){
            wb = new XSSFWorkbook(inputstream);
        }else if(extensionName.equalsIgnoreCase(".xls")){
            wb = new HSSFWorkbook(inputstream);
        }
        //Read the sheet name
        Sheet wbSheet = wb.getSheet(sheetName);
        System.out.println("Sheet Name is: "+wbSheet);

    }

  @Test(priority=1)
  public void readData(Sheet wbSheet) {

    // Get the row count
            int rowCount = wbSheet.getLastRowNum() - wbSheet.getFirstRowNum();

            // print data from excel
            for (int i=0; i<rowCount-1; i++){
                Row row = wbSheet.getRow(i);
                for (int j=0; j<row.getLastCellNum(); j++){
                    System.out.println(row.getCell(j).getStringCellValue()+"||");
                }
            }
  }
}

當我在Eclipse中運行時,我看到以下異常-

org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)
    at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:128)
    at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:112)
    at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:300)
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:400)
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:381)
    at handlefiles.handleExcel.readExcel(handleExcel.java:36)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:86)
    at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:514)
    at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:215)
    at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:142)
    at org.testng.TestRunner.beforeRun(TestRunner.java:656)
    at org.testng.TestRunner.run(TestRunner.java:624)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:366)
    at org.testng.SuiteRunner.access$000(SuiteRunner.java:39)
    at org.testng.SuiteRunner$SuiteWorker.run(SuiteRunner.java:400)
    at org.testng.internal.thread.ThreadUtil$2.call(ThreadUtil.java:64)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

根據堆棧跟蹤,POI認為您正在嘗試使用POI的XLS代碼(不是XLSX代碼)打開XLSX文件。 也許文件擴展名錯誤,因為該文件是“ .xls”,但應該是“ .xlsx”,或者文件已損壞等。(或者您發現了錯誤)。

我建議改用POI的WorkbookFactory

通過從提供的輸入中自動檢測,用於創建適當種類的工作簿( HSSFWorkbookXSSFWorkbook )的XSSFWorkbook

刪除以下IF條件,然后

if(extensionName.equalsIgnoreCase(".xlsx")){
            wb = new XSSFWorkbook(inputstream);
        }else if(extensionName.equalsIgnoreCase(".xls")){
            wb = new HSSFWorkbook(inputstream);
        }

添加這段代碼

 wb = new XSSFWorkbook(inputstream);

我過去使用過,但從未告訴過我正在使用哪個擴展名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM