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

如何使用Apache POI根据Excel表头标题向指定列写入数据

按Excel表头匹配写入指定列的实现方案

前置问题修复

原有writeHeaders方法存在两处问题需要先调整:

  • 循环写入表头时counter变量未自增,所有表头都会被写入索引为1的同一列
  • Workbook、Sheet对象未作为类成员变量保存,后续写入数据时无法复用同一个文件操作实例,也无法快速匹配表头和列的对应关系

完整实现步骤

1. 定义类成员变量

首先在类中声明所需的全局操作对象和缓存变量:

// Excel工作簿对象
private XSSFWorkbook workbook;
// Excel工作表对象
private XSSFSheet sheet;
// 表头名称与对应列索引的映射缓存
private Map<String, Integer> headerColumnMap = new HashMap<>();
// 记录当前已写入数据的最后一行行号,表头占第0行,数据从第1行开始
private int currentRowNum = 1;

注意:请确保你的自定义Data类已提供id和header属性的public getter方法,若属性为public可直接访问,无需额外调整。

2. 修复后的表头写入方法

private void writeHeaders() {
    workbook = new XSSFWorkbook();
    sheet = workbook.createSheet("ok");
    Row headerRow = sheet.createRow(0);
    String[] headers = {"aaa", "bbb", "ccc"};
    for (int i = 0; i < headers.length; i++) {
        // 列索引从1开始,和原有逻辑的counter初始值保持一致
        int columnIndex = i + 1;
        Cell cell = headerRow.createCell(columnIndex);
        String headerName = headers[i];
        cell.setCellValue(headerName);
        // 缓存表头与列索引的对应关系,后续写入数据直接查询即可
        headerColumnMap.put(headerName, columnIndex);
    }
    // 此处不关闭工作簿,待所有数据写入完成后再统一保存关闭
}

3. 按表头匹配写入数据的实现

替换原有if-else判断逻辑,通过映射缓存直接查询对应列,后续新增表头无需修改写入逻辑:

private void writeInSpecificColumn(Data data) {
    // 校验表头合法性,不合法可根据业务需求选择抛出异常或跳过
    if (!headerColumnMap.containsKey(data.getHeader())) {
        throw new IllegalArgumentException("未识别的表头:" + data.getHeader());
    }
    // 获取目标列索引
    Integer targetColumn = headerColumnMap.get(data.getHeader());
    // 创建新的数据行,若需要往同一行的不同列写入数据,可复用Row对象,无需每次创建新行、不自增行号
    Row currentRow = sheet.createRow(currentRowNum);
    Cell cell = currentRow.createCell(targetColumn);
    cell.setCellValue(data.getId());
    // 行号自增,下次写入下一行
    currentRowNum++;
}

4. 数据写完后的保存关闭逻辑

所有数据写入完成后调用该方法,将内容持久化到文件并释放资源:

private void saveAndClose() throws IOException {
    try (FileOutputStream outputStream = new FileOutputStream("ok.xlsx")) {
        workbook.write(outputStream);
    } finally {
        workbook.close();
    }
}

使用示例

// 1. 写入表头
writeHeaders();
// 2. 写入多条数据
writeInSpecificColumn(new Data(101, "aaa"));
writeInSpecificColumn(new Data(202, "bbb"));
writeInSpecificColumn(new Data(303, "ccc"));
// 3. 保存文件释放资源
saveAndClose();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 23:27:03