21xrx.com
2025-03-25 05:12:18 Tuesday
文章检索 我的文章 写文章
用Java实现excel列和对象属性的映射
2023-06-15 16:49:46 深夜i     16     0
Java excel 映射

在做数据处理的时候经常需要将excel文件中的数据映射到Java对象中,但是excel表格的列名与Java对象的属性名可能并不相同,如何实现对应关系呢?这就需要用到excel列和对象属性的映射。

我们可以使用Apache POI库来操作excel文件,在这个库的基础上,再自己实现一个映射工具类来实现列和对象属性之间的转换。

下面是一个简单的示例:

1. 定义一个Java类作为映射目标,假设它有两个属性 name 和 age:

public class Person
  private String name;
  private int age;
  // getter和setter方法...

2. 在excel表格中,我们需要给这两个属性起一个对应的列名,比如 "姓名" 和 "年龄"。

3. 实现映射工具类,这个类需要实现两个方法:

- 一个将列名转换为属性名的方法,比如将 "姓名" 转换为 "name";

- 另一个将excel一行的数据转换为一个Java对象的方法,该方法需要使用上述的转换结果来设置Java对象的属性值。

示例代码如下:

public class MappingUtils {
  // 列名和属性名的映射关系
  private static final Map
  COLUMN_TO_FIELD = new HashMap<>();
 
  static {
    COLUMN_TO_FIELD.put("姓名", "name");
    COLUMN_TO_FIELD.put("年龄", "age");
  }
  
  /**
   * 将列名转换为属性名
   */
  public static String columnToField(String column) {
    return COLUMN_TO_FIELD.get(column);
  }
  
  /**
   * 将一行数据转换为Java对象
   */
  public static Person rowToObj(Row row) {
    Person person = new Person();
    for (Cell cell : row) {
      String columnName = cell.getStringCellValue();
      String fieldName = columnToField(columnName);
      if (fieldName != null) {
        switch (fieldName) {
          case "name":
            person.setName(row.getCell(cell.getColumnIndex() + 1).getStringCellValue());
            break;
          case "age":
            person.setAge((int) row.getCell(cell.getColumnIndex() + 1).getNumericCellValue());
            break;
        }
      }
    }
    return person;
  }
}

在这个工具类中,我们将列名和属性名的映射关系保存在一个Map中,每次需要转换时直接从Map中获取即可;同时,对于一行数据的转换,我们使用了 POI 提供的 Cell 和 Row 等对象来访问 excel 文件中的数据。

通过上述代码,我们就实现了 excel 列和对象属性的转换,并将转换逻辑封装在了 MappingUtils 类中,调用时只需要传递一个 Row 对象即可返回一个映射好的 Java 对象。

  
  

评论区