140.md 6.9 KB
Newer Older
W
wizardforcel 已提交
1
# 10j。 高级 WebDriver – 使用 POI 从 excel 读取数据
W
init  
wizardforcel 已提交
2 3 4

> 原文: [https://javabeginnerstutorial.com/selenium/10j-advanced-webdriver-reading-data-from-excel-using-poi/](https://javabeginnerstutorial.com/selenium/10j-advanced-webdriver-reading-data-from-excel-using-poi/)

W
wizardforcel 已提交
5
朋友! 今天,让我们深入研究 excel 表并了解如何从中读取数据。 作为自动化和构建自动化框架的一部分,我们倾向于将数据以预定义的格式(通常遵循模板)存储在 excel 表中。 我们存储的数据主要是测试数据,不同的测试 URL,发布特定的参数等。在这种情况下,知道如何在我们的代码中处理 excel 表就变得非常重要。
W
init  
wizardforcel 已提交
6

W
wizardforcel 已提交
7
这将是另一篇纯 Java 文章。 因此,您该喝一杯咖啡(Java)了!! 我们将使用 POI jar 来实现此目的。
W
init  
wizardforcel 已提交
8

W
wizardforcel 已提交
9
## 步骤 1:
W
init  
wizardforcel 已提交
10

W
wizardforcel 已提交
11
与往常一样,我们的第一步是下载所需的 POI JAR。 转至 [Apache POI](https://poi.apache.org/download.html#POI-3.17) ,然后下载最新稳定版本的二进制发行版(在撰写本文时,3.17 是最新稳定发行版)。 单击该 zip 文件的二进制版本,重定向到实际的[下载页面](https://www.apache.org/dyn/closer.lua/poi/release/bin/poi-bin-3.17-20170915.zip)
W
init  
wizardforcel 已提交
12 13 14

![POI download link](data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20859%20433'%3E%3C/svg%3E)

W
wizardforcel 已提交
15 16 17 18
![POI download link](img/66dde6eb58d06604bfe3993478f8010c.png)

## **步骤 2:**

W
wizardforcel 已提交
19
将这些 JAR 添加到我们的项目构建路径中。 确保选择“`poi-x.xx`”,“`ooxml-lib`”和“`lib`”文件夹下的所有 JAR。 我还将这些以及其他所有代码文件都放在了我们的 [GitHub 仓库](https://github.com/JBTAdmin/Selenium/tree/master/AdvancedWebDriver/Reading%20data%20from%20excel)中。
W
wizardforcel 已提交
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

我们之前已经多次看到这种添加 JAR 来构建路径过程的内容,因此我没有在重复它(有关详细说明,请参阅此[文章](https://javabeginnerstutorial.com/selenium/9b-webdriver-eclipse-setup/)的步骤 3)。

## **步骤 3:**

创建一个新类“`ExcelOperationsUsingPOI.java`”。 在此类中,让我们有一种从特定位置读取 excel 文件的特定图纸的方法。

*   通过传递您要打开的 excel 文件的完整文件路径来创建`File`类的对象 - `File file = new File(filePath+"\\"+fileName);`
*   下一步是创建一个`FileInputStream`对象,以获取 excel 文件的输入字节 - `FileInputStream inputStream = new FileInputStream(file);`
*   创建一个工作簿对象 - `Workbook myWorkbook = null;`
*   Excel 文件在大多数情况下可以具有两个扩展名。 “`.xls`”或“`.xlsx`”。 通过使用子字符串方法拆分文件名来找到扩展名,并相应地创建`Workbook`对象。

```java
//indexOf gives the index of . in the file name
//substring method splits the string starting from index of . to the end
String fileExtensionName = fileName.substring(fileName.indexOf("."));
       
//Check condition if the file is xlsx file
if(fileExtensionName.equals(".xlsx")){
//If it is xlsx file then create object of XSSFWorkbook class
myWorkbook = new XSSFWorkbook(inputStream);
}

//Check condition if the file is xls file
else if(fileExtensionName.equals(".xls")){
//If it is xls file then create object of HSSFWorkbook class
  myWorkbook = new HSSFWorkbook(inputStream);
}
```

*   使用传递的确切工作表名称,可以读取特定工作表 - `Sheet mySheet = myWorkbook.getSheet(sheetName);`

现在,使用行和列很容易,它们的交点将为我们提供我们希望读取的单元格内容。

现在让我们来看一下实现到目前为止讨论的全部功能的代码,

### **`ExcelOperationsUsingPOI.java`**

```java
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

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;

public class ExcelOperationsUsingPOI {
   public static void readExcel(String filePath,String fileName,String sheetName) throws IOException{

        //Create a object of File class to open xlsx file
        File file = new File(filePath+"\\"+fileName);

        //Create an object of FileInputStream class to read excel file
        FileInputStream inputStream = new FileInputStream(file);

        Workbook myWorkbook = null;

        //Find the file extension by spliting file name in substring and getting only extension name
        //indexOf gives the index of . in the file name
        //substring method splits the string starting from index of . to the end
        String fileExtensionName = fileName.substring(fileName.indexOf("."));
       
        //Check condition if the file is xlsx file
        if(fileExtensionName.equals(".xlsx")){
        //If it is xlsx file then create object of XSSFWorkbook class
        	myWorkbook = new XSSFWorkbook(inputStream);
        }

        //Check condition if the file is xls file
        else if(fileExtensionName.equals(".xls")){
            //If it is xls file then create object of HSSFWorkbook class
        	myWorkbook = new HSSFWorkbook(inputStream);
        }

        //Read sheet inside the workbook by its name
        Sheet mySheet = myWorkbook.getSheet(sheetName);

        //Find number of rows in excel file
        int rowCount = mySheet.getLastRowNum()- mySheet.getFirstRowNum();
        
        //Create a loop over all the rows of excel file to read it
        for (int i = 0; i < rowCount+1; i++) {
            Row row = mySheet.getRow(i);
            //Create a loop to print cell values in a row
            for (int j = 0; j < row.getLastCellNum(); j++) {
                //Print excel data in console
                System.out.print(row.getCell(j).getStringCellValue()+"|| ");
            }
            System.out.println();
        }		    
   }
}
```

### **`ReadExcelData.java`**

用于调用`readExcel`方法并传递必需的参数。

```java
import java.io.IOException;
import com.blog.utility.ExcelOperationsUsingPOI;

public class ReadExcelData {

  public static void main(String[] args) {
    try {
      ExcelOperationsUsingPOI.readExcel("E:\\Selenium", "ReadUsingPOI.xlsx", "Demographics");
    } catch (IOException e) {
      e.printStackTrace();
    } 
  }
}
```

注释使代码不言自明。 所考虑的 Excel 工作表中的数据如下所示,

![Excel Sheet](img/86b09846221b07ad4f56bd5bde566b64.png)

使用我们的代码访问此信息将按预期方式打印出所有用管道分隔的值,以便将其控制台。

![excel console output](img/afeb40dbbf98d4b1f60208d231d21f9c.png)

如果您想检索代码段,请在注释部分大声疾呼,

1.  给定条目的从零开始的行和列索引
2.  使用给定的从零开始的行和列索引的值
3.  基于给定条目的列表中的所有行值
4.  基于给定条目的列表中的所有列值

试用这些功能,让我知道您是否遇到颠簸。

祝你今天愉快!