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
相关产品推荐
相关产品推荐

