You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java遍历Excel唯一Code值,结合Selenium批量填写网页表单

按Code分组处理Excel数据并通过Selenium批量填写表单

问题场景

现有如下结构的Excel表格:

codevehicles
101vehicle01
101vehicle02
102vehicle04
102vehicle04
102vehicle05
103vehicle06
......

需求是:将同一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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 10:15:47