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

如何用Java实现两个Excel表格间的Vlookup匹配写入?

实现Excel Vlookup功能(基于Apache POI)

核心思路

你已经读取了第二个表格的数据到ArrayList,但直接用ArrayList做匹配效率较低,建议先把第二个表格的A列值作为键,B列值作为对应值存入HashMap,后续匹配可以通过键快速查找。之后遍历第一个表格的每一行,用A列值去HashMap中匹配,找到对应值就写入D列。


代码实现步骤

1. 将ArrayList转换为HashMap

假设你的ArrayList中数据按[A列值1, B列值1, A列值2, B列值2, ...]的顺序存储,执行以下转换:

// 你已有的第二个表格数据ArrayList
List<String> secondSheetData = new ArrayList<>(Arrays.asList("A", "B", "1", "AA", "2", "BB", "3", "CC"));

// 转换为HashMap,key=A列值,value=B列值
Map<String, String> lookupMap = new HashMap<>();
for (int i = 0; i < secondSheetData.size(); i += 2) {
    if (i + 1 < secondSheetData.size()) {
        lookupMap.put(secondSheetData.get(i), secondSheetData.get(i + 1));
    }
}

2. 读取第一个表格并执行匹配写入

// 加载第一个Excel文件(XSSF处理.xlsx,HSSF对应.xls)
FileInputStream fis = new FileInputStream("第一个表格路径.xlsx");
XSSFWorkbook firstWorkbook = new XSSFWorkbook(fis);
XSSFSheet firstSheet = firstWorkbook.getSheetAt(0); // 取第一个工作表

// 遍历表格行(跳过表头,从第2行开始,下标从1起)
for (int rowNum = 1; rowNum <= firstSheet.getLastRowNum(); rowNum++) {
    XSSFRow row = firstSheet.getRow(rowNum);
    if (row == null) continue;

    // 获取当前行A列的值(下标0)
    XSSFCell aCell = row.getCell(0);
    if (aCell == null) continue;
    String aValue = getCellValueAsString(aCell); // 自定义方法转换单元格值为字符串

    // 从HashMap中查找对应B列值
    String matchedValue = lookupMap.get(aValue);
    if (matchedValue != null) {
        // 创建或获取D列单元格(下标3)
        XSSFCell dCell = row.getCell(3);
        if (dCell == null) {
            dCell = row.createCell(3);
        }
        // 写入匹配到的值
        dCell.setCellValue(matchedValue);
    }
}

// 保存修改后的第一个表格
FileOutputStream fos = new FileOutputStream("修改后的第一个表格路径.xlsx");
firstWorkbook.write(fos);

// 关闭资源
fos.close();
firstWorkbook.close();
fis.close();

3. 辅助方法:将单元格值转换为字符串

Excel单元格有不同类型(数字、文本等),统一转换为字符串方便匹配:

private static String getCellValueAsString(XSSFCell cell) {
    switch (cell.getCellType()) {
        case STRING:
            return cell.getStringCellValue();
        case NUMERIC:
            // 处理数字类型,整数转字符串
            if (cell.getNumericCellValue() == (int) cell.getNumericCellValue()) {
                return String.valueOf((int) cell.getNumericCellValue());
            } else {
                return String.valueOf(cell.getNumericCellValue());
            }
        case BOOLEAN:
            return String.valueOf(cell.getBooleanCellValue());
        case FORMULA:
            return cell.getCellFormula();
        default:
            return "";
    }
}

内容的提问来源于stack exchange,提问作者JackofallTrade

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 11:45:55