我使用opencsv-4.0
写一个csv文件,我需要在输出文件中添加列标题。
这是我的代码。
public static void buildProductCsv(final List<Product> product,
final String filePath) {
try {
Writer writer = new FileWriter(filePath);
// mapping of columns with their positions
ColumnPositionMappingStrategy<Product> mappingStrategy = new ColumnPositionMappingStrategy<Product>();
// Set mappingStrategy type to Product Type
mappingStrategy.setType(Product.class);
// Fields in Product Bean
String[] columns = new String[] { "productCode", "MFD", "EXD" };
// Setting the colums for mappingStrategy
mappingStrategy.setColumnMapping(columns);
StatefulBeanToCsvBuilder<Product> builder = new StatefulBeanToCsvBuilder<Product>(writer);
StatefulBeanToCsv<Product> beanWriter = builder.withMappingStrategy(mappingStrategy).build();
// Writing data to csv file
beanWriter.write(product);
writer.close();
log.info("Your csv file has been generated!");
} catch (Exception ex) {
log.warning("Exception: " + ex.getMessage());
}
}
上面的代码创建了一个包含数据的csv文件。但它不包括文件中列标题。
我如何添加列标题到输出csv?
7条答案
按热度按时间5q4ezhmt1#
ColumnPositionMappingStrategy#generateHeader返回空数组
如果从BeanToCsv构建器中删除MappingStrategy,
它将把Product的类成员作为CSV头写入
如果您的产品类成员名称是
这应该是正确的解决方案
否则,添加@CsvBindByName注解
输出量:
“EXD”、“MFD”、“PRODUCTCODE”
“111”、“11”、“1”
“222”,“22”,“2”
“333”,“33”,“3”
注意;由于OpenCSV库使用了Reflection,类、getters和setters需要是公共的
eivgtgni2#
可以通过注解追加
l7mqbcuq3#
我可能错过了一些明显的东西,但你不能把你的头字符串附加到作家对象吗?
gmol16394#
使用HeaderColumnNameMappingStrategy进行阅读,然后使用相同的策略进行写入。在这种情况下,“相同”意味着不仅仅是相同的类,而是实际上相同的对象。
从
StatefulBeanToCsvBuilder.withMappingStrategy
的javadoc:读取CSV源代码,从读取操作中获取Map策略,并将其传递给此方法进行写入操作,这是完全合法的。这节省了一些处理时间,但更重要的是,保留了头的顺序。
这样您将得到一个包含标题的CSV,其中列的顺序与原始CSV相同。
我使用OpenCSV 5.4。
ttygqcqt5#
使用自定义策略
在CSV对象上,不要忘记提供这两个
r3i60tvu6#
对于那些想同时使用HeaderName和Position而不先阅读csv文件的用户。
使用自定义Map策略很容易实现。
在bean中,您现在可以定义两个注解
作者应该看起来像这样:
这将同时使用CsvBindByName和CsvBindByPosition。
(或者,您也可以只使用HeaderNameBaseMappingStrategy并设置ColumnOrderOnWrite,而不使用继承)
gblwokeq7#
您还可以重写generateHeaders方法并返回设置的列Map,它将在csv中具有header行