1.pom.xml引入jar包
com.opencsv
opencsv
4.4
2.重写映射规则
public class CustomMappingStrategy extends ColumnPositionMappingStrategy {
@Override
public String[] generateHeader(T bean) throws CsvRequiredFieldEmptyException {
super.setColumnMapping(new String[ FieldUtils.getAllFields(bean.getClass()).length]);
final int numColumns = findMaxFieldIndex();
if (!isAnnotationDriven() || numColumns == -1) {
return super.generateHeader(bean);
}
String[] header = new String[numColumns + 1];
BeanField beanField;
for (int i = 0; i <= numColumns; i++) {
beanField = findField(i);
String columnHeaderName = extractHeaderName(beanField);
header[i] = columnHeaderName;
}
return header;
}
private String extractHeaderName(final BeanField beanField) {
if (beanField == null || beanField.getField() == null || beanField.getField().getDeclaredAnnotationsByType(CsvBindByName.class).length == 0) {
return StringUtils.EMPTY;
}
final CsvBindByName bindByNameAnnotation = beanField.getField().getDeclaredAnnotationsByType(CsvBindByName.class)[0];
return bindByNameAnnotation.column();
}
}
3.实体类(bean)添加注解 @CsvBindByPosition 和 @CsvBindByName
public class WftTestEntity implements Serializable{
private static final long serialVersionUID = 1L;
/**
*交易时间
*/
@CsvBindByPosition(position = 0)
@CsvBindByName(column = "交易时间")
private String test1;
/**
*公众账号ID
*/
@CsvBindByPosition(position = 1)
@CsvBindByName(column = "公众账号ID")
private String test2;
public String getTest1() {
return test1;
}
public void setTest1(String test1) {
this.test1 = test1;
}
public String getTest2() {
return test2;
}
public void setTest2(String test2) {
this.test2 = test2;
}
}
4.解析并转换为bean
4.1:单一的转换(非泛型)
/**
* 解析csv文件并转成bean
* @return
* @throws IOException
*/
public static List getWftTestEntityList(String fileName) throws IOException{
InputStreamReader is = new InputStreamReader(new FileInputStream(fileName),"GBK");
HeaderColumnNameMappingStrategy mappingStrategy = new HeaderColumnNameMappingStrategy<>();
mappingStrategy.setType(WftTestEntity.class);
CsvToBean build = new CsvToBeanBuilder(is).withMappingStrategy(mappingStrategy).withQuoteChar('`').withSeparator('"').withSeparator(',').withSeparator('"').build();
List wftTestEntityList = build.parse();
return wftTestEntityList;
}
4.2:通用的转换(泛型)
/**
* 解析csv文件并转成bean
* @param fileName
* @param clazz
* @param
* @return
* @throws IOException
*/
public static List getCsvData(String fileName, Class clazz) throws IOException{
InputStreamReader is = new InputStreamReader(new FileInputStream(fileName),"gbk");
HeaderColumnNameMappingStrategy strategy = new HeaderColumnNameMappingStrategy<>();
strategy.setType(clazz);
CsvToBean csvToBean = new CsvToBeanBuilder(is)
.withSeparator(',')
.withQuoteChar('\'')
.withMappingStrategy(strategy).build();
return csvToBean.parse();
}
5.调用测试mian
public static void main(String[] args) throwsIOException{//调用
List wftTestEntities = getWftTestEntityList("路径+csv文件名");
List wftTestEntityList = getCsvData("路径+csv文件名",WftTestEntity.class);
}