1. 概述

在 Java 应用中操作 Excel 文件是一个常见的需求。本文将重点介绍如何使用 Apache POI 库在 Excel 文件中的两行之间插入新行。

2. Maven 依赖

首先,我们需要在 pom.xml 文件中添加 poi-ooxml 依赖:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.5</version>
</dependency>

3. 在两行之间插入新行

3.1. Apache POI 相关类

Apache POI 是一组用于操作不同文件格式的库。其中 XSSF 库专门用于处理 .xlsx 格式的 Excel 文件。下图展示了用于操作 .xlsx 文件的相关接口和类:

Figures Page 4

3.2. 实现行插入逻辑

要在 Excel 表格中间插入 m 行,需要将从插入点开始到最后一行的所有行向下移动 m 行。

步骤一:读取 Excel 文件

我们使用 XSSFWorkbook 类来加载 Excel 文件:

Workbook workbook = new XSSFWorkbook(fileLocation);

步骤二:获取工作表

通过 getSheetAt() 方法获取第一个工作表:

Sheet sheet = workbook.getSheetAt(0);

步骤三:移动行

获取最后一行的行号,并使用 shiftRows() 方法将指定范围内的行向下移动:

int lastRow = sheet.getLastRowNum(); 
sheet.shiftRows(startRow, lastRow, rowNumber, true, true);

⚠️ 注意事项:

  • shiftRows(startRow, lastRow, rowNumber, true, true) 方法中两个 true 参数分别表示是否复制行高和是否重置行号。
  • 此操作会保留原有行的格式,包括隐藏行也会一并移动。

步骤四:创建新行

调用 createRow() 方法在指定位置创建新行:

sheet.createRow(startRow);

3.3. 单元测试示例

我们编写一个测试案例,读取资源目录下的 Excel 文件,在第 2 行插入一行,然后写入新的文件并验证结果。

public void givenWorkbook_whenInsertRowBetween_thenRowCreated() {
    int startRow = 2;
    int rowNumber = 1;
    Workbook workbook = new XSSFWorkbook(fileLocation);
    Sheet sheet = workbook.getSheetAt(0);

    int lastRow = sheet.getLastRowNum();
    if (lastRow < startRow) {
        sheet.createRow(startRow);
    }

    sheet.shiftRows(startRow, lastRow, rowNumber, true, true);
    sheet.createRow(startRow);

    FileOutputStream outputStream = new FileOutputStream(NEW_FILE_NAME);
    workbook.write(outputStream);

    File file = new File(NEW_FILE_NAME);

    final int expectedRowResult = 5;
    Assertions.assertEquals(expectedRowResult, workbook.getSheetAt(0).getLastRowNum());

    outputStream.close();
    file.delete();
    workbook.close();
}

📌 测试说明:

  • 测试文件中原始有 4 行数据。
  • 插入一行后,总行数应为 5。
  • 最终断言验证插入是否成功。

4. 总结

通过本文,我们掌握了如何使用 Apache POI 在 Excel 文件中插入新行。核心步骤包括读取文件、移动现有行、创建新行。整个过程保持了原有格式不变,适合需要精细控制 Excel 内容的场景。

如需查看完整源码,请访问 GitHub 项目地址


原始标题:Insert a Row in Excel Using Apache POI