OpenCSV: How to create CSV file from POJO with custom column headers and custom column positions?

后端 未结 19 1509
温柔的废话
温柔的废话 2020-12-08 04:14

I have created a MappingsBean class where all the columns of the CSV file are specified. Next I parse XML files and create a list of mappingbeans. Then I write that data int

19条回答
  •  孤街浪徒
    2020-12-08 04:52

    I think the intended and most flexible way of handling the order of the header columns is to inject a comparator by HeaderColumnNameMappinStrategy.setColumnOrderOnWrite().

    For me the most intuitive way was to write the CSV columns in the same order as they are specified in the CsvBean, but you can also adjust the Comparator to make use of your own annotations where you specify the order. Don´t forget to rename the Comparator class then ;)

    Integration:

    HeaderColumnNameMappingStrategy mappingStrategy = new HeaderColumnNameMappingStrategy<>();
        mappingStrategy.setType(MyCsvBean.class);
        mappingStrategy.setColumnOrderOnWrite(new ClassFieldOrderComparator(MyCsvBean.class));
    

    Comparator:

    private class ClassFieldOrderComparator implements Comparator {
    
        List fieldNamesInOrderWithinClass;
    
        public ClassFieldOrderComparator(Class clazz) {
            fieldNamesInOrderWithinClass = Arrays.stream(clazz.getDeclaredFields())
                    .filter(field -> field.getAnnotation(CsvBindByName.class) != null)
                  // Handle order by your custom annotation here
                  //.sorted((field1, field2) -> {
                  //   int field1Order = field1.getAnnotation(YourCustomOrderAnnotation.class).getOrder();
                  //   int field2Order = field2.getAnnotation(YourCustomOrderAnnotation.class).getOrder();
                  //   return Integer.compare(field1Order, field2Order);
                  //})
                    .map(field -> field.getName().toUpperCase())
                    .collect(Collectors.toList());
        }
    
        @Override
        public int compare(String o1, String o2) {
            int fieldIndexo1 = fieldNamesInOrderWithinClass.indexOf(o1);
            int fieldIndexo2 = fieldNamesInOrderWithinClass.indexOf(o2);
            return Integer.compare(fieldIndexo1, fieldIndexo2);
        }
    }
    

提交回复
热议问题