2

如何将我的 bean 转换MyClassCsv为带有可选列名称的 CSV 文件?CSV 文件中必须包含或不包含列“标题”。

豆子:

@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class MyClassCsv implements Serializable {
   
    private static final long serialVersionUID = -6476622625063619084L;

    @CsvBindByName(column = "id")
    private Integer id;

    @CsvBindByName(column = "name")
    private String name; 
    
    @CsvBindByName(column = "title")
    private String title; 
    
    ...
}

写入 CSV:

final Writer writer = new FileWriter(fileCsv.getPath());

try {
    final HeaderColumnNameMappingStrategy<HoteIncbCsv> strategy = new HeaderColumnNameMappingStrategy<>();
    strategy.setType(MyClassCsv.class);

    // **** optional mapped 'title'  ***** //
    if (!useTitle) {
        // ?????????
    }
    
    final StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder(writer).withMappingStrategy(strategy).withSeparator(';').withApplyQuotesToAll(false).build();

    // Ecriture dans le fichier CSV de sortie
    beanToCsv.write(myClassCsv);

} finally {
    writer.close();
}
4

1 回答 1

1

我知道这是旧帖子,但是在做类似的事情时偶然发现了它,也许有人需要解决方案。 HeaderColumnNameMappingStrategy 具有 setIgnoredFields可以在这种情况下使用的方法。您可以创建或多或少这样的东西来创建策略

private HeaderColumnNameMappingStrategy <MyClassCsv> createHeaderStrategy(boolean title) throws NoSuchFieldException {
    HeaderColumnNameMappingStrategy strategy = new HeaderColumnNameMappingStrategy<MyClassCsv >();
    strategy.setType(MyClassCsv.class);
    if(!title){
        MultiValuedMap<Class<?>, Field> ignore = new ArrayListValuedHashMap<Class<?>, Field>();
        ignore.put(MyClassCsv.class, MyClassCsv.class.getDeclaredField("title")) 
        strategy.ignoreFields(ignore);
    }
    return strategy 
}

这当然可以通过一些自定义注释更好地完成,以便在需要时排除更多字段,并消除潜在捕获 NoSuchFieldException 异常的需要。

于 2021-01-26T15:37:45.760 回答