You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenCSV从4.1升级到5.7.1后,ColumnPositionMappingStrategy写入Bean无数据

解决OpenCSV 5.7.1版本ColumnPositionMappingStrategy无数据输出问题

问题原因

OpenCSV 5.x版本对StatefulBeanToCsv与ColumnPositionMappingStrategy的交互逻辑做了调整,手动调用csvWriter.writeNext(columns)写入表头会干扰内部的写入流程,导致数据行无法正常输出。

修正方案

1. 移除手动写入表头的代码

删除csvWriter.writeNext(columns);,让StatefulBeanToCsv配合ColumnPositionMappingStrategy自动生成表头,同时保证数据行正常写入。

2. 优化代码(可选但推荐)

使用try-with-resources自动管理流资源,避免手动关闭时的异常泄漏;同时修正泛型声明,让代码更严谨。

修正后的完整代码

public void generateCSVFile(List<?> domains, String[] columns, String fileName) {
    if (CollectionUtils.isEmpty(domains)) {
        return;
    }
    try (FileWriter writer = new FileWriter(fileName);
         CSVWriter csvWriter = new CSVWriter(writer)) {
        
        Class<?> beanClass = domains.get(0).getClass();
        ColumnPositionMappingStrategy<?> mappingStrategy = new ColumnPositionMappingStrategy<>();
        mappingStrategy.setType(beanClass);
        mappingStrategy.setColumnMapping(columns);
        
        // 如果需要自定义表头(非属性名),可以添加下面一行,否则表头会使用columns中的属性名
        // mappingStrategy.setColumnNames(yourCustomHeaderArray);
        
        StatefulBeanToCsv<?> beanWriter = new StatefulBeanToCsvBuilder<>(csvWriter)
                .withMappingStrategy(mappingStrategy)
                .build();
                
        beanWriter.write(domains);
    } catch (Exception e) {
        LOG.error("Exception occured while generating CSV file : {}", e);
    }
}

关键说明

  • setColumnMapping(columns):这里的columns必须是Java Bean的属性名(大小写严格匹配,除非配置属性名转换器),用来指定Bean属性与CSV列的对应顺序。
  • 如果需要输出自定义表头(比如中文表头或非属性名文本),可以调用mappingStrategy.setColumnNames(yourCustomHeaderArray),其中yourCustomHeaderArray是自定义表头数组,长度要和columns一致。
  • try-with-resources会自动关闭FileWriter和CSVWriter,无需手动调用close()方法,更安全可靠。

内容的提问来源于stack exchange,提问作者Abirami

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 02:10:32