繁体   English   中英

如何使用apache-poi将Excel工作表中的值设置为Pojo对象?

[英]How to set values from an excel sheet to Pojo object using apache-poi?

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

现在我想使用休眠框架在表格中输入excelsheet提供的值。因此,我在Java应用程序中创建了一个pojo,它具有180个属性,因此有180个getter和180个setter。

我认为将这些值设置为pojo属性的唯一方法是迭代列迭代器,然后调用pojo的setter方法。 我很好奇,是否有任何更聪明或更有效的方法可以做到这一点?

注意:我试图规范化表,但是由于没有重复的数据,所以我认为表不能规范化

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

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

如果使用反射,则字段说明符为字段名。 使用字段名称来确定要调用的二传手。

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

可以做这样的事情。 仅适用于非原始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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM