如何用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
相关产品推荐
相关产品推荐

