【问题标题】:How to set values from an excel sheet to Pojo object using apache-poi?如何使用 apache-poi 将 excel 表中的值设置为 Pojo 对象?
【发布时间】:2014-07-31 20:57:13
【问题描述】:

我正在尝试使用 apache-poi 从 excel 表中获取值,而不是将这些值输入到 mysql 数据库中。使用 apache-poi 我可以使用 XSSFSheet.rowIterator() xssfrow.cellIterator() 来获取值;这个 Excel 表提供了 10000 行和 180 列。

现在我想使用 hibernate 框架将这些 excelsheet 提供的值输入到表中。所以我在我的 java 应用程序中创建了一个 pojo,其中有 180 个属性,所以有 180 个 getter 和 180 个 setter。

我认为将这些值设置为 pojo 属性的唯一方法是迭代列迭代器,然后调用 pojo 的 setter 方法。我很想知道有没有更聪明或更有效的方法来做到这一点?

注意:我曾尝试规范化表格,但由于没有重复数据,所以我认为该表格无法规范化

【问题讨论】:

  • 你怎么知道在迭代器中为next 值调用哪个setter?这似乎是一个非常奇怪的设计。如果您的 180 个值在 Map 中,我可以理解,其中键是字段名称或设置器的名称。
  • 你怎么知道哪个值匹配哪个setter?你能给我们一些你迭代的数据的例子吗?
  • 实际上我正在尝试从 excel 表中获取值,然后将这些值存储到数据库中。我正在使用 apache POI api。通过它我使用迭代器获取值。
  • 那么您也有一个包含 180 列的表?
  • 我读对了 180 个 getter 和 setter 吗?你真的需要委托你的代码。

标签: java jakarta-ee collections apache-poi


【解决方案1】:

所以在我看来,您有两个选择:使用枚举或反射。无论哪种方式,您都需要生成一个 Map,其中键是字段说明符,值是要存储在该字段中的值。

我建议您阅读第一行以获取列名并将它们映射到字段名。然后,当您读取每个数据行时,会生成一个Map<FieldSpecifier, value>。

如果您使用反射,则字段说明符将是字段名称。使用字段名称来确定调用哪个 setter。

如果您使用的是 Enum,则 Enum 将包含 180 个值。每个 Enum 实例中都会有一个抽象方法 (setValue) 来调用适当的 setter。然后映射中的字段说明符是适当的 Enum 实例。然后只需迭代 Map Entries 调用 key.set 方法传递 DTO 实例和条目值。

【讨论】:

  • 它有帮助.. 非常感谢 :)
【解决方案2】:

可以做这样的事情。仅适用于非原始 atm。可以检查值是否扩展数字并进行原始检查。

public class ValueInserter<T> {

    public T objectCreationImplementation(Map<String, Object> methodValueMap, Class<T> clazz) throws NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
        T o = (T) clazz.newInstance();
        for (String parameter: methodValueMap.keySet()) {
            Method method = clazz.getMethod(getSetterName(parameter), methodValueMap.get(parameter).getClass());
            method.invoke(o, methodValueMap.get(parameter));
        }
        return o;
    }
    private String getSetterName(String parameter) {
        return "set" + parameter.substring(0, 1).toUpperCase() + parameter.substring(1);
    }
}

【讨论】:

  • 仅供参考,您应该使用 entrySet 而不是 keySet,因为您需要键和值。迭代时进行地图查找(map.get)没有意义。特别是因为你调用了两次 get。
  • 感谢您的帮助:)
猜你喜欢
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-27
  • 1970-01-01
相关资源
最近更新 更多