如何在Java中使用Apache POI将Excel列标题作为键处理数据?
用Excel列标题作为键按列处理数据的解决方案
我明白你现在的需求啦——你想把Excel的列标题作为HashMap的键,这样就能按列提取和打印数据,而不是原来用行号当键的按行处理方式。咱们来调整一下代码就能实现:
核心思路
- 先读取第一行的列标题,把这些标题作为HashMap的键,每个键对应一个空列表,用来存储该列的所有数据
- 从第二行开始遍历每一行,把每个单元格的数据根据列索引匹配到对应的列标题键下的列表中
- 最后遍历HashMap,按列输出标题和对应的数据
修改后的代码
XSSFWorkbook workbook = new XSSFWorkbook(file); XSSFSheet sheet = workbook.getSheet("Bill"); Iterator<Row> rowIterator = sheet.iterator(); // 用列标题作为键,存储每一列的所有数据 HashMap<String, List<String>> columnDataMap = new HashMap<>(); // 第一步:读取表头行(第一行),初始化HashMap的键 if (rowIterator.hasNext()) { Row headerRow = rowIterator.next(); Iterator<Cell> cellIterator = headerRow.cellIterator(); while (cellIterator.hasNext()) { Cell headerCell = cellIterator.next(); String headerName = headerCell.getStringCellValue(); // 为每个列标题初始化一个空列表 columnDataMap.put(headerName, new LinkedList<String>()); } } // 第二步:遍历后续所有行,把数据按列存入对应列表 while (rowIterator.hasNext()) { Row row = rowIterator.next(); // 遍历当前行的每个单元格,根据列索引匹配表头 for (int colIndex = 0; colIndex < columnDataMap.size(); colIndex++) { Cell cell = row.getCell(colIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK); String cellValue = ""; // 处理不同类型的单元格数据 switch (cell.getCellType()) { case Cell.CELL_TYPE_NUMERIC: int numValue = (int) cell.getNumericCellValue(); cellValue = Integer.toString(numValue); break; case Cell.CELL_TYPE_STRING: cellValue = cell.getStringCellValue(); break; case Cell.CELL_TYPE_BLANK: cellValue = ""; break; // 可以根据需要添加其他类型的处理,比如布尔值、公式等 } // 获取当前列对应的表头名称 String headerName = (String) columnDataMap.keySet().toArray()[colIndex]; // 把当前单元格数据加入对应列的列表 columnDataMap.get(headerName).add(cellValue); } } // 第三步:按列打印数据 for (String header : columnDataMap.keySet()) { System.out.println(header + "-----" + columnDataMap.get(header)); } // 别忘了关闭workbook,避免资源泄漏 workbook.close();
关键说明
- 我们用
Row.MissingCellPolicy.CREATE_NULL_AS_BLANK来处理空单元格,避免出现NullPointerException - 表头行必须是第一行(行号0),如果你的表头在其他行,只需要调整读取表头的逻辑即可
- 可以根据实际需求扩展单元格类型的处理(比如公式、布尔值等)
内容的提问来源于stack exchange,提问作者Sat.N
相关产品推荐
相关产品推荐

