如何用Java遍历Excel唯一Code值,结合Selenium批量填写网页表单
按Code分组处理Excel数据并通过Selenium批量填写表单
问题场景
现有如下结构的Excel表格:
| code | vehicles |
|---|---|
| 101 | vehicle01 |
| 101 | vehicle02 |
| 102 | vehicle04 |
| 102 | vehicle04 |
| 102 | vehicle05 |
| 103 | vehicle06 |
| ... | ... |
需求是:将同一code对应的所有vehicles填入网页表单,完成后为下一个code在新标签页打开表单并填入对应数据。当前代码逐行读取Excel并打开标签页,无法按code分组处理。
现有读取Excel的Java代码片段:
[...] XSSFWorkbook book = new XSSFWorkbook(inputStream); XSSFSheet s = book.getSheet(selectedtab); Row row; Integer startFrom = 2; for(int i=startFrom -1; i <= s.getLastRowNum(); i++) { row = s.getRow(i); String code = row.getCell(0).getStringCellValue(); String vehicles= row.getCell(1).getStringCellValue(); ((JavascriptExecutor)driver).executeScript("window.open()"); ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles()); tabs = new ArrayList<String>(driver.getWindowHandles()); driver.switchTo().window(tabs.get(tabs.size()-1)); [...]
解决方案
核心思路是先将Excel数据按code分组存储,再遍历分组后的数据,每个code对应打开一个标签页并填写所有关联的vehicles。
步骤1:读取Excel并分组数据
使用Map<String, List<String>>存储分组结果,键为code,值为该code对应的所有vehicles列表。如果需要去重重复的vehicles,可以用LinkedHashSet保证顺序和唯一性。
步骤2:遍历分组数据批量处理表单
遍历分组后的Map,每个code对应打开一个新标签页,然后将该组的所有vehicles填入表单。
完整代码示例:
// 1. 读取Excel并分组数据 XSSFWorkbook book = new XSSFWorkbook(inputStream); XSSFSheet s = book.getSheet(selectedtab); // 用Map存储分组数据,key是code,value是对应的vehicles列表 Map<String, List<String>> codeVehicleMap = new HashMap<>(); Integer startFrom = 2; for(int i = startFrom - 1; i <= s.getLastRowNum(); i++) { Row row = s.getRow(i); if(row == null) continue; // 跳过空行 String code = row.getCell(0).getStringCellValue(); String vehicle = row.getCell(1).getStringCellValue(); // 分组逻辑:如果code不存在则新建列表,否则添加到已有列表 codeVehicleMap.computeIfAbsent(code, k -> new ArrayList<>()).add(vehicle); // 可选:去重处理(如果需要去掉重复的vehicle) // codeVehicleMap.computeIfAbsent(code, k -> new ArrayList<>(new LinkedHashSet<>())).add(vehicle); } // 2. 遍历分组数据,逐个处理每个code for(Map.Entry<String, List<String>> entry : codeVehicleMap.entrySet()) { String currentCode = entry.getKey(); List<String> vehicles = entry.getValue(); // 打开新标签页 ((JavascriptExecutor)driver).executeScript("window.open()"); ArrayList<String> tabs = new ArrayList<>(driver.getWindowHandles()); driver.switchTo().window(tabs.get(tabs.size() - 1)); // 这里填写表单逻辑:先填入code(如果需要),再逐个填入vehicles // 示例:填入code到表单字段 // driver.findElement(By.id("code-input")).sendKeys(currentCode); // 遍历vehicles填入表单,根据实际表单结构调整 for(String vehicle : vehicles) { // 示例:添加vehicle到表单的输入框或列表 // driver.findElement(By.id("vehicle-input")).sendKeys(vehicle); // 如果需要点击添加按钮:driver.findElement(By.id("add-vehicle-btn")).click(); } // 可选:提交表单 // driver.findElement(By.id("submit-form")).click(); } // 关闭工作簿 book.close();
关键说明
computeIfAbsent方法简化了分组逻辑,无需手动判断key是否存在。- 如果表单中
vehicles不能重复,可以用LinkedHashSet包装列表实现去重。 - 表单填写逻辑需要根据实际网页元素ID/定位器调整,示例代码中的选择器仅作参考。
内容的提问来源于stack exchange,提问作者Raúl Casado
相关产品推荐
相关产品推荐

