【问题标题】:Why is writing beans to CSV not working after OpenCSV upgrade from 4.1 to 5.7.1为什么在 OpenCSV 从 4.1 升级到 5.7.1 后将 bean 写入 CSV 不起作用
【发布时间】:2022-12-05 16:20:30
【问题描述】:

我正在使用 OpenCSV 将 Java bean 写入 CSV 文件。这是代码 sn-p:

  public void generateCSVFile(List<?> domains, String[] columns, String fileName) {
    try {
    final FileWriter writer = new FileWriter(fileName);
    CSVWriter csvWriter = new CSVWriter(writer);
    csvWriter.writeNext(columns);
    if (CollectionUtils.isNotEmpty(domains)) {
        ColumnPositionMappingStrategy mappingStrategy = new ColumnPositionMappingStrategy();
        mappingStrategy.setType(Class.forName(domains.get(0).getClass().getTypeName()));
        mappingStrategy.setColumnMapping(columns);
        StatefulBeanToCsvBuilder<?> builder = new StatefulBeanToCsvBuilder(
                csvWriter);
        StatefulBeanToCsv beanWriter = builder.withMappingStrategy(mappingStrategy).build();
        beanWriter.write(domains);
        csvWriter.close();
        writer.close();
    }
    }
    catch(Exception e){
       LOG.error("Exception occured while generating CSV file : {}", e)
     }
}

这适用于 opencsv 4.1 版。这生成了一个 CSV 文件,其中的标题和列按照我传递列 (String[]) 的顺序排列。最近,我将版本更新到 5.7.1,之后它生成的 CSV 文件只包含标题而不包含数据。它生成一个空文件,生成的文件中只有标题。

我试过使用HeaderColumnNameMappingStrategy。它生成包含数据的文件,但按属性的升序排列,并且属性为大写,因为这是默认行为。

有没有办法让ColumnPositionMappingStrategy 与 5.7.1 版一起工作,就像它在 4.1 版中一样?

【问题讨论】:

  • 你确定 domains 不是空的?
  • 是的。域列表不为空。

标签: java csv serialization opencsv


【解决方案1】:

这种方法适用于 OpenCSV 版本 4.1 和 5.7:

连载

public static <T> void writeToCSV(String location, Class<T> type, List<T> records, String[] columns)
          throws IOException, CsvRequiredFieldEmptyException, CsvDataTypeMismatchException {

    ColumnPositionMappingStrategy<T> mappingStrategy = new ColumnPositionMappingStrategy<>();
    mappingStrategy.setType(type);
    mappingStrategy.setColumnMapping(columns);
    try (Writer writer = new FileWriter(location)) {
      StatefulBeanToCsv<T> beanToCsv = new StatefulBeanToCsvBuilder<T>(writer)
                      .withMappingStrategy(mappingStrategy)
                      .withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)
                      .build();
      beanToCsv.write(records);
    }
}

使用示例

String[] columns = new String[]{"a", "b"};
List<Bean> objects = List.of(new Bean("A1", "B1"),
                             new Bean("A2", "B2"));
String location = "beans.csv";

try {
    CSVUtils.writeToCSV(location, Bean.class, objects, columns);
} catch (IOException | CsvRequiredFieldEmptyException | CsvDataTypeMismatchException e) {
    e.printStackTrace();
}

假设类 Bean 有两个字符串属性 ab

我用 Java 8、11 和 17 测试了上面的内容。

【讨论】:

    猜你喜欢
    • 2022-12-03
    • 1970-01-01
    • 2016-01-09
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    相关资源
    最近更新 更多