Java进行Excel操作

目的:想通过获取Excel的值来执行自动化脚本

库的选择

        Java中支持Excel操作的最好的库是Apache POI。它是Apache基金会下的一个开源项目,提供了读写Microsoft Office文件的Java API。它支持读取和写入Excel文件的各种格式,包括xls和xlsx等格式,同时还支持Word、PowerPoint和Outlook等Microsoft Office文件的操作。使用Apache POI,你可以很容易地读取、创建、修改和保存Excel文件,以及获取Excel文件中的单元格、行、列、工作表和工作簿等信息。

依赖导入

依赖库查找地址:https://mvnrepository.com/

Gradle导入依赖是在build.gradle下添加

api 'org.apache.poi:poi-ooxml:5.0.0'

注意:如果你要使用Apache POI读写Microsoft Office 2007及以上版本的文件(即.xlsx文件),则需要下载和使用Apache POI API Based On OPC and OOXML Schemas库,因为它是基于OOXML格式的,能够解析并处理OOXML文件格式。

          如果你要使用Apache POI读写Microsoft Office 2003及以下版本的文件(即.xls文件),则需要下载和使用Apache POI Common库,因为它是基于HSSF格式的,能够解析并处理HSSF文件格式。

Mave则使用

<dependency>

<groupId>org.apache.poi</groupId>

<artifactId>poi-ooxml</artifactId>

<version>5.0.0</version>

</dependency>

加载依赖

此处以IDEA开发工具为例:

方法一:通过File->Invalidate Caches/Restart,删除原来的缓存和索引,等待Idea重新构建缓存和索引

方法二:在最右侧找到Gradle或者Maven点击刷新按钮重新加载依赖

 代码例子

使用java+appium+testng实现现批量导入Excel中的数据值执行测试脚本

1)调用readFromXLSX2007()方法从Excel文件中读取测试数据,并将测试数据存储在testDataList列表中。
public void readTestData() throws IOException {
FileInputStream inputStream = new FileInputStream(new File("testData.xlsx"));
Workbook workbook = new XSSFWorkbook(inputStream);
Sheet sheet = workbook.getSheet("Sheet1");
testDataList = new ArrayList<>();
Iterator<Row> rowIterator = sheet.iterator();
while (rowIterator.hasNext()) {
Row row = rowIterator.next();
Map<String, String> testDataMap = new HashMap<>();
testDataMap.put("TestCaseName", row.getCell(0).getStringCellValue());
testDataMap.put("TestData1", row.getCell(1).getStringCellValue());
testDataMap.put("TestData2", row.getCell(2).getStringCellValue());
testDataList.add(testDataMap);
}
workbook.close();
inputStream.close();
}
2)创建一个二维数组testData,并将其初始化为testDataList列表的大小。
     遍历testDataList列表,将每个测试数据映射(Map)转换为一个一维数组,然后将其存储在二维数组testData中。
    返回二维数组testData,使测试代码可以使用这些测试数据进行测试
private List<Map<String, String>> testDataList;
@DataProvider(name = "testData")
public Object[][] getTestData() {
Object[][] testData = new Object[testDataList.size()][1];
for (int i = 0; i < testDataList.size(); i++) {
Map<String, String> testDataMap = testDataList.get(i);
testData[i][0] = testDataMap;
}
return testData;
}
3)定义了一个名为testMethod的方法,该方法需要一个Map<string, string="">类型的参数testDataMap,该Map对象可以用来存储测试数据或其他需要保存的数据
 
@Test(dataProvider = "testData")
public void testMethod(Map<String, String> testDataMap) {
String testCaseName = testDataMap.get("TestCaseName");
String testData1 = testDataMap.get("TestData1");
String testData2 = testDataMap.get("TestData2");
// 获取到数据批量执行指定的测试用例
}
可根据项目需要,如果要批量添加映射excel文件字段的代码可看以下代码:
public class AutoMakeMap {

public static void readFromXLSX2007(String filePath) {
File excelFile = null;// Excel文件对象
InputStream is = null;// 输入流对象
String cellStr = null;// 单元格,最终按字符串处理
try {
excelFile = new File(filePath);
is = new FileInputStream(excelFile);// 获取文件输入流
XSSFWorkbook workbook2007 = new XSSFWorkbook(is);// 创建Excel2007文件对象
XSSFSheet sheet = workbook2007.getSheetAt(0);// 取出第一个工作表,索引是0
// 开始循环遍历行,表头不处理,从1开始
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
// for (int i = 0; i <= 490; i++) {
XSSFRow row = sheet.getRow(i);// 获取行对象
if (row == null) {// 如果为空,不处理
continue;
}
// 循环遍历单元格
for (int j = 0; j < row.getLastCellNum(); j++) {
// for (int j = 0; j < 2; j++) {
XSSFCell cell = row.getCell(j);// 获取单元格对象
if (cell == null) {// 单元格为空设置cellStr为空串
cellStr = "";
} else if (cell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN) {// 对布尔值的处理
cellStr = String.valueOf(cell.getBooleanCellValue());
} else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {// 对数字值的处理
cellStr = cell.getNumericCellValue() + "";
} else {// 其余按照字符串处理
cellStr = cell.getStringCellValue();
}
// 下面按照数据出现位置封装到bean中
if (j == 0) {
System.out.print("commandMap[\"" + cellStr + "\"] = \"");
} else if (j == 1) {
System.out.println(cellStr + "\"");
}
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {// 关闭文件流
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args){
AutoMakeMap amm = new AutoMakeMap();
amm.readFromXLSX2007("D://aaa.xlsx");

}
}

运行结果:
commandMap["command_01"] = "del-确认信息-在校学生-博士-4000以下-父母-建行-北京-申请成功"

commandMap["command_02"] = "del-确认信息-在校学生-硕士-4000以下-父母-建行-北京-申请成功"

commandMap["command_03"] = "del-确认信息-在校学生-本科-4000以下-父母-建行-北京-申请成功"

commandMap["command_04"] = "del-确认信息-在校学生-专科-4000以下-父母-建行-北京-申请成功"

commandMap["command_05"] = "del-确认信息-在校学生-高中以下-4000以下-父母-建行-北京-申请成功"

commandMap["command_06"] = "del-确认信息-在校学生-博士-4000-6000-父母-建行-北京-申请成功"

commandMap["command_07"] = "del-确认信息-在校学生-博士-6000~8000-父母-建行-北京-申请成功"

posted @ 2023-06-28 09:45  ~风  阅读(355)  评论(0)    收藏  举报