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

