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
文件的相关接口和类:
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 项目地址。