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

如何在Java中使用Apache POI将Excel列标题作为键处理数据?

用Excel列标题作为键按列处理数据的解决方案

我明白你现在的需求啦——你想把Excel的列标题作为HashMap的键,这样就能按列提取和打印数据,而不是原来用行号当键的按行处理方式。咱们来调整一下代码就能实现:

核心思路

  1. 先读取第一行的列标题,把这些标题作为HashMap的键,每个键对应一个空列表,用来存储该列的所有数据
  2. 从第二行开始遍历每一行,把每个单元格的数据根据列索引匹配到对应的列标题键下的列表中
  3. 最后遍历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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:44:37