Apache POI 中如何在Java中向Excel追加行数

497 阅读2分钟

学习在Java中使用Apache POI在excel表中追加新行。在这个例子中,我们将学习如何准备数据(写入),然后在现有工作表的最后一行之后追加新的行。

1.Maven的依赖性

在应用程序中添加最新版本的org.apache.poi:poiorg.apache.poi:poi-ooxml,如果尚未添加的话。

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.2</version>
</dependency>

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

2.核心类和方法

POI使用以下类来读取或写入数据。

  • XSSFWorkbook:表示一个excel工作簿。
  • Sheet: 代表工作簿中的一个工作表。
  • Row代表工作表中的一行。
  • Cell代表任何一行中的一个单元。

要向工作表写入或追加记录,我们需要使用以下方法。

  • workbook.getSheetAt(index) 或 通过索引或名称获得工作表。索引从0开始。workbook.getSheet(name)
  • sheet.getLastRowNum() 返回工作表中的最后一行编号。在追加新行的情况下有帮助。
  • sheet.createRow(num) 在给定的工作表中创建一个新的行。
  • row.createCell(num) 在给定的行中创建一个新的单元格。
  • cell.setCellValue(val) 在给定的单元格中设置一个值。

3.向工作表添加行

使用上面讨论的方法,我们将在下面的Excel表中追加新的行。

这些数据可以是任何形式的。为了保持简单,我们有以下包含数据的模型。

public class BusinessEntity {

  private String firstName;
  private String lastName;
  private String age;

  //constructors, getters and setters
}

尽管我们可以根据需要编写逻辑,但在这里我们要创建一个通用的Object[] ,我们将把它传递给一个实用函数。对象数组中的值按照索引顺序被映射到行中的单元格。

private static Map<Integer, Object[]> prepareData(int rowNum,
    List<BusinessEntity> recordsToWrite) {

    Map<Integer, Object[]> data = new HashMap<>();
    for (BusinessEntity entity : recordsToWrite) {
      rowNum++;
      data.put(rowNum, new Object[]{rowNum, entity.getFirstName(),
          entity.getLastName(), entity.getAge()});
    }
    return data;
}

下面是在excel中写入记录的实用函数。它把文件路径和记录作为方法参数。然后它调用prepareData()来创建对象数组。最后,对象数组被迭代,并根据数组中的索引填充单元格值。

请注意,该函数检查对象数组中数值的数据类型,因此我们可以调用相应的setCellValue()方法。

public static void appendRows(List<BusinessEntity> recordsToWrite, File file)
  throws IOException, InvalidFormatException {

XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(file));
    Sheet sheet = workbook.getSheetAt(0);
    int rowNum = sheet.getLastRowNum() + 1;

    Map<Integer, Object[]> data = prepareData(rowNum, recordsToWrite);

    Set<Integer> keySet = data.keySet();
    for (Integer key : keySet) {
        Row row = sheet.createRow(rowNum++);
        Object[] objArr = data.get(key);
        int cellNum = 0;
        for (Object obj : objArr) {
        Cell cell = row.createCell(cellNum++);
        if (obj instanceof String)
            cell.setCellValue((String) obj);
        else if (obj instanceof Integer)
            cell.setCellValue((Integer) obj);
        }
    }
    try {
      FileOutputStream out = new FileOutputStream(file);
      workbook.write(out);
      out.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
}

4.演示

为了运行这个演示,我们将创建一些记录,并将它们与文件路径一起传递给实用程序appendRows()

public static void main(String[] args) {

    File file = new File("C:\\temp\\data.xlsx");

    List<BusinessEntity> recordsToWrite = List.of(
        new BusinessEntity("Charles", "Babej", 60),
        new BusinessEntity("John", "Doe", 70),
        new BusinessEntity("Loreum", "Ipsum", 80)
    );

    try {
      appendRows(recordsToWrite, file);
    } catch (IOException | InvalidFormatException e) {
      e.printStackTrace();
    }
}

验证excel文件中附加的行。注意,格式化单元格值不属于本教程的范围。

5.总结

在这个Apache POI教程中,我们学会了通过创建一些实用函数在现有的excel表中添加新行。我建议你玩玩这些代码,以便更好地理解。

学习愉快!!