问题描述
我正在使用opencsv-4.0
编写一个csv文件,并且需要在输出文件中添加列标题.
I am using opencsv-4.0
to write a csv file and I need to add column headers in output file.
这是我的代码.
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文件.但该文件中不包括列标题.
Above code create a csv file with data. But it not include column headers in that file.
如何添加列标题以输出csv?
How could I add column headers to output csv?
推荐答案
ColumnPositionMappingStrategy#generateHeader返回空数组
ColumnPositionMappingStrategy#generateHeader returns empty array
/**
* This method returns an empty array.
* The column position mapping strategy assumes that there is no header, and
* thus it also does not write one, accordingly.
* @return An empty array
*/
@Override
public String[] generateHeader() {
return new String[0];
}
如果您从BeanToCsv构建器中删除MappingStrategy
If you remove MappingStrategy from BeanToCsv builder
// replace
StatefulBeanToCsv<Product> beanWriter = builder.withMappingStrategy(mappingStrategy).build();
// with
StatefulBeanToCsv<Product> beanWriter = builder.build();
它将产品类的成员写为CSV标头
It will write Product's class members as CSV header
如果您的Product类成员名称是
If your Product class members names are
"productCode", "MFD", "EXD"
这应该是正确的解决方案
This should be the right solution
否则,添加@CsvBindByName批注
Else, add @CsvBindByName annotation
import com.opencsv.bean.CsvBindByName;
import com.opencsv.bean.StatefulBeanToCsv;
import com.opencsv.bean.StatefulBeanToCsvBuilder;
import java.io.FileWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
public class CsvTest {
public static void main(String[] args) throws Exception {
Writer writer = new FileWriter(fileName);
StatefulBeanToCsvBuilder<Product> builder = new StatefulBeanToCsvBuilder<>(writer);
StatefulBeanToCsv<Product> beanWriter = builder.build();
List<Product> products = new ArrayList<>();
products.add(new Product("1", "11", "111"));
products.add(new Product("2", "22", "222"));
products.add(new Product("3", "33", "333"));
beanWriter.write(products);
writer.close();
}
public static class Product {
@CsvBindByName(column = "productCode")
String id;
@CsvBindByName(column = "MFD")
String member2;
@CsvBindByName(column = "EXD")
String member3;
Product(String id, String member2, String member3) {
this.id = id;
this.member2 = member2;
this.member3 = member3;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getMember2() {
return member2;
}
public void setMember2(String member2) {
this.member2 = member2;
}
public String getMember3() {
return member3;
}
public void setMember3(String member3) {
this.member3 = member3;
}
}
}
输出:
"111","11","1"
"111","11","1"
"222","22","2"
"222","22","2"
"333","33","3"
"333","33","3"
注意;类,吸气剂设置者需要公开,因为OpenCSV库使用了Reflection
Pay attention; class, getters & setters needs to be public due to the use of Reflection by OpenCSV library
这篇关于带列标题的StatefulBeanToCsv的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!