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

后端 未结 19 1457
温柔的废话
温柔的废话 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:53

    Corrected above answer to match with newer version.

    package csvpojo;
    
    import org.apache.commons.lang3.StringUtils;
    
    import com.opencsv.bean.BeanField;
    import com.opencsv.bean.ColumnPositionMappingStrategy;
    import com.opencsv.bean.CsvBindByName;
    import com.opencsv.exceptions.CsvRequiredFieldEmptyException;
    
    class CustomMappingStrategy extends ColumnPositionMappingStrategy {
        @Override
        public String[] generateHeader(T bean) throws CsvRequiredFieldEmptyException {
    
    super.setColumnMapping(new String[ FieldUtils.getAllFields(bean.getClass()).length]);
            final int numColumns = findMaxFieldIndex();
            if (!isAnnotationDriven() || numColumns == -1) {
                return super.generateHeader(bean);
            }
    
            String[] header = new String[numColumns + 1];
    
            BeanField beanField;
            for (int i = 0; i <= numColumns; i++) {
                beanField = findField(i);
                String columnHeaderName = extractHeaderName(beanField);
                header[i] = columnHeaderName;
            }
            return header;
        }
    
        private String extractHeaderName(final BeanField beanField) {
            if (beanField == null || beanField.getField() == null
                    || beanField.getField().getDeclaredAnnotationsByType(CsvBindByName.class).length == 0) {
                return StringUtils.EMPTY;
            }
    
            final CsvBindByName bindByNameAnnotation = beanField.getField()
                    .getDeclaredAnnotationsByType(CsvBindByName.class)[0];
            return bindByNameAnnotation.column();
        }
    }
    

    Then call this to generate CSV. I have used Visitors as my POJO to populate, update wherever necessary.

            CustomMappingStrategy mappingStrategy = new CustomMappingStrategy<>();
            mappingStrategy.setType(Visitors.class);
            // writing sample
            List beans2 = new ArrayList();
    
            Visitors v = new Visitors();
            v.set_1_firstName(" test1");
            v.set_2_lastName("lastname1");
            v.set_3_visitsToWebsite("876");
            beans2.add(v);
    
            v = new Visitors();
            v.set_1_firstName(" firstsample2");
            v.set_2_lastName("lastname2");
            v.set_3_visitsToWebsite("777");
            beans2.add(v);
    
            Writer writer = new FileWriter("G://output.csv");
            StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder(writer)
                    .withMappingStrategy(mappingStrategy).withSeparator(',').withApplyQuotesToAll(false).build();
            beanToCsv.write(beans2);
            writer.close();
    

    My bean annotations looks like this

     @CsvBindByName (column = "First Name", required = true)
     @CsvBindByPosition(position=1)
     private String firstName;
    
    
     @CsvBindByName (column = "Last Name", required = true)
     @CsvBindByPosition(position=0)
     private String lastName;
    

提交回复
热议问题