<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>4.6</version>
</dependency>
(1) CSVParserBuilder 解析器构建器
方法 | 描述 |
CSVParserBuilder() | 构造方法 |
withSeparator(char separator) | 设置分隔符,默认为逗号 |
withQuoteChar(char quoteChar) | 设置文本边界符,默认为双引号 |
withEscapeChar(char escapeChar) | 设置转译字符,默认为\\ |
withStrictQuotes(boolean strictQuotes) | 设置严格按文本边界符区分文本,默认false |
withIgnoreLeadingWhiteSpace(boolean ignore) | 设置是否忽略前导空白,默认true |
withIgnoreQuotations(boolean ignore) | 设置是否忽略边界符 |
build() | 构建CSVParser对象 |
getXxxx() isXxxx() | 获取withXxxx()相关方法的值 |
withFieldAsNull(CSVReaderNullFieldIndicator field) | 设置空字段处理模式 |
withErrorLocale(Locale errorLocale) | 设置错误错域 |
nullFieldIndicator()|| | 获取当前空值处理 |
(2) RFC4180ParserBuilder
方法 | 描述 |
---|---|
RFC4180ParserBuilder() | 构造方法 |
getSeparator() | 获取分隔符 |
getQuoteChar() | 获取文本边界符 |
nullFieldIndicator() | 获取空字段处理模式 |
withSeparator(char separator) | 设置分隔符 |
withQuoteChar(char quoteChar) | 设置文本边界符 |
withFieldAsNull(CSVReaderNullFieldIndicator fieldIndicator) | 设置空字段处理模式 |
build() | 构建RFC4180Parser对象 |
(3) CSVReaderBuilder 读取器构造器
方法 | 描述 |
CSVReaderBuilder(Reader reader) | 构造方法,传入csv文件流 |
withSkipLines(int skipLines) | 设置读取起始行,默认为0,从第一行开始,设置为1则跳过第一行 |
withCSVParser(ICSVParser icsvParser) | 设置解析器,不设置返回每行的数据 |
withKeepCarriageReturn(boolean keepCR) | 是否保持回车,默认false |
withFieldAsNull(CSVReaderNullFieldIndicator indicator) | 设置空字段处理模式 |
withMultilineLimit(int multilineLimit) | 设置多行限制 |
withErrorLocale(Locale errorLocale) | 设置错误区域 |
build() | 构建CSVReader |
isVerifyReader() | 验证是否验证读入流 |
getErrorLocale() | 获取错误区域 |
(4) CsvToBeanBuilder 读取到对象构造器
方法 | 描述 |
CsvToBeanBuilder(Reader reader) | 构造方法,参数可为CSVReader |
withMappingStrategy(MappingStrategy<T> mapping) | 设置映射策略 |
withFilter(CsvToBeanFilter filter) | 设置过滤器 |
withThrowExceptions(boolean throwExceptions) | 设置是否扔出异常 |
withFieldAsNull(CSVReaderNullFieldIndicator indicator) | 设置空字段处理模式 |
withKeepCarriageReturn(boolean keepCR) | 是否保持回车,默认false |
withVerifyReader(boolean verifyReader) | 设置是否验证读入流 |
withSkipLines(int skipLines) | 设置读取起始行,默认为0,从第一行开始,设置为1则跳过第一行 |
withSeparator(char separator) | 设置分隔符 |
withQuoteChar(char quoteChar) | 设置文本边界符,默认为双引号 |
withEscapeChar(char escapeChar) | 设置转译字符,默认为\\ |
withStrictQuotes(boolean strictQuotes) | 设置严格按文本边界符区分文本,默认false |
withIgnoreLeadingWhiteSpace(boolean ignoreLeadingWhiteSpace) | 设置是否忽略前导空白,默认true |
withIgnoreQuotations(boolean ignoreQuotations) | 设置忽略文本边界符 |
withType(Class<? extends T> type) | 设值实体类型 |
withMultilineLimit(int multilineLimit) | 设置多行限制 |
withOrderedResults(boolean orderedResults) | 设置是否是有序结果,默认为true |
withErrorLocale(Locale errorLocale) | 设置错误区域 |
withVerifier(BeanVerifier<T> verifier) | 设置javaBean验证器 |
build() | 构建CsvToBean对象 |
(5) CSVWriterBuilder
方法 | 描述 |
CSVWriterBuilder(Writer writer) | 构造器 |
withParser(ICSVParser parser) | 设置解析器 |
withSeparator(char separator) | 设置分隔符 |
withQuoteChar(char quoteChar) | 设置文本边界符,默认为双引号 |
withEscapeChar(char escapeChar) | 设置转译字符,默认为\\ |
withLineEnd(String lineEnd) | 行分隔符,默认为\n |
build() | 构建CSVWriter对象 |
(6) StatefulBeanToCsvBuilder 实体转CSV建造器
方法 | 描述 |
StatefulBeanToCsvBuilder(Writer writer) | 构造方法 |
withMappingStrategy(MappingStrategy<T> mappingStrategy) | 设置映射策略 |
withSeparator(char separator) | 设置分隔符 |
withQuotechar(char quotechar) | 设置文本边界符,默认为双引号 |
withEscapechar(char escapechar) | 设置转译字符,默认为\\ |
withLineEnd(String lineEnd) | 行分隔符,默认为\n |
withThrowExceptions(boolean throwExceptions) | 设置是否扔出异常,默认为true |
withOrderedResults(boolean orderedResults) | 设置是否是有序结果,默认为true |
withErrorLocale(Locale errorLocale) | 设置错误区域 |
withApplyQuotesToAll(boolean applyQuotesToAll) | 设置是否所有用文本边界符 |
build() | 构建StatefulBeanToCsv对象 |
(7) CSVReaderHeaderAwareBuilder
方法 | 描述 |
---|---|
CSVReaderHeaderAwareBuilder(Reader reader) | 构造器 |
build() | 构建CSVReaderHeaderAware对象 |
(1) ICSVParser 解析器接口
方法 | 描述 |
getSeparator(); | 获取分隔符 |
getQuotechar() | 获取文本边界符 |
isPending() | 判断是否是等待中 |
parseLineMulti(String var1) | 解析多行 |
parseLine(String var1) | 解析行 |
parseToLine(String[] var1, boolean var2) | 解析到行 |
nullFieldIndicator() | 获取空字段处理模式 |
getPendingText() | 获取等待处理的字符串 |
(2) CSVParser 解析器实现类
方法 | 描述 |
getEscape() | 获取转义符 |
isIgnoreLeadingWhiteSpace() | 是否忽略领先的空白 |
isIgnoreQuotations() | 是否忽略文本边界符 |
isStrictQuotes() | 判断严格按文本边界符区分文本 |
(3) RFC4180Parser 解析器实现类
(4) CSVReader
方法 | 描述 |
getParser() | 获取解析器 |
getSkipLines() | 获取设置的跳过行数 |
keepCarriageReturns() | 保持回车 |
readAll()| | 获取当前行及之后的所有行数据 |
readNext() | 获取当前行数据,下次调用为下一行 |
close() | 关闭流 |
iterator() | 获取迭代器 |
verifyReader() | 判断是否验证读入流 |
getLinesRead() | 获取行数 |
getRecordsRead() | 获取记录数 |
skip(int number) | 跳过number行 |
setErrorLocale(Locale errorLocale) | 设置错误区域 |
peek() | 获取当前行数据,下次调用还是这行 |
(5) CsvToBean
方法 | 描述 |
parse() | 解析CSV |
getCapturedExceptions() | 获取捕获的异常 |
setMappingStrategy(MappingStrategy<T> mappingStrategy) | 设置映射策略 |
setCsvReader(CSVReader csvReader) | 设置Csv阅读器 |
setFilter(CsvToBeanFilter filter) | 设置过滤器 |
setThrowExceptions(boolean throwExceptions) | 设置是否抛出异常 |
setOrderedResults(boolean orderedResults) | 设置是否获取有序结果集 |
setErrorLocale(Locale errorLocale) | 设置错误区域 |
setVerifiers(List<BeanVerifier<T>> verifiers) | 设置实体验证 |
iterator() | 获取迭代器 |
(6) ICSVWriter
方法 | 描述 |
writeAll(Iterable<String[]> var1, boolean var2) | 写入所有数据 |
writeNext(String[] var1, boolean var2) | 写入一行数据 |
checkError() | 检查是否有异常 |
setResultService(ResultSetHelper var1) | 设置结果集助手 |
flushQuietly() | 关流 |
(7) StatefulBeanToCsv
方法 | 描述 |
write(T bean) | 写出一个实体 |
write(List<T> beans) | 写出一个实体集合 |
setOrderedResults(boolean orderedResults) | 设置是否获取有序结果集 |
isThrowExceptions() | 判断是否抛出异常 |
getCapturedExceptions() | 获取捕获的异常 |
setErrorLocale(Locale errorLocale) | 设置错误区域 |
(8) CSVReaderHeaderAware
方法 | 描述 |
---|---|
CSVReaderHeaderAware(Reader reader) | 构造方法 |
readNext(String... headerNames) | 读取指定列数据 第一次调用获取第二行数据,第二次调用获取第三行数据,..... |
readMap() | 读取数据为Map 第一次调用获取第一行与第二行数据Map,第二次调用获取第一行与第三行数据Map,..... |
(1) AbstractMappingStrategy 抽象策略常用方法
方法 | 描述 |
createBean() | 创建一个实体 |
findHeader(int var1) | 找到标题 |
findMaxFieldIndex() | 找到最大字段索引 |
generateHeader(T bean) | 获取标题 |
getColumnName(int col) | 获取列表 |
getType() | 获取类型 |
populateNewBean(String[] line) | 填充新实体 |
setType(Class<? extends T> type) | 设置类型 |
isAnnotationDriven() | 判断是否是注解驱动 |
setErrorLocale(Locale errorLocale) | 设置错误区域 |
transmuteBean(T bean) | 转换实体 |
verifyLineLength(int var1) | 验证行长度 |
(2) 常用实现类
方法 | 描述 | 方法(不包括抽象父类方法) | 描述 |
ColumnPositionMappingStrategy | 列位置映射策略 | setColumnMapping(String... columnMapping) | 设置列映射,对应字段 |
HeaderColumnNameMappingStrategy | 标题列名称映射策略 | setColumnOrderOnWrite(Comparator<String> writeOrder) | 设置写出的列顺序 |
HeaderColumnNameTranslateMappingStrategy | 标题列名称翻译映射策略, 与HeaderColumnNameMappintStrategy相比, bean的属性名可以与csv列头不一样。通过指定map来映射。 | getColumnMapping() setColumnMapping(Map<String, String> columnMapping) | 获取与设置列映射 |
方法 | 描述 | 属性 | 描述 |
@CsvBindByPosition | 按位置绑定 | required | 必须字段,默认为false.该字段为空抛异常 |
position | 位置索引 | ||
locale,capture,format | |||
@CsvBindByName | 按表头名称绑定 | required | 必须字段,默认为false.该字段为空抛异常 |
column | 对象列标题名称 | ||
locale,capture,format | |||
@CsvCustomBindByName | 与CsvBindByName相同,但必须提供自己的数据转换类。 | converter | 转换器 |
column | 对象列标题名称 | ||
required | 必须字段,默认为false.该字段为空抛异常 | ||
@CsvCustomBindByPosition | 与CsvBindByPosition相同,但必须提供自己的数据转换类。 | converter | 转换器 |
position | 位置索引 | ||
required | 必须字段,默认为false.该字段为空抛异常 | ||
@CsvBindAndJoinByName | 应用于MultiValuedMap集合类型的bean字段 通过标题名称绑定 | required | 必须字段,默认为false.该字段为空抛异常 |
column | 对象列标题名称 | ||
mapType | 集合类型 | ||
elementTyp | 元素类型 | ||
converter | 转换器 | ||
locale,capture,format | |||
@CsvBindAndJoinByPosition | 应用于MultiValuedMap集合类型的bean字段 通过位置索引绑定 | required | 必须字段,默认为false.该字段为空抛异常 |
position | 位置索引 | ||
mapType | 集合类型 | ||
elementType | 元素类型 | ||
converter | 转换器 | ||
locale,capture,format | |||
@CsvBindAndSplitByName | 应用于Collection集合类型的bean字段 通过标题名称绑定 | required | 必须字段,默认为false.该字段为空抛异常 |
column | 对象列标题名称 | ||
splitOn | |||
writeDelimiter | 元素之间的分隔符 | ||
collectionType | 集合类型 | ||
elementType | 元素类型 | ||
converter | 转换器 | ||
locale,capture,format | |||
@CsvBindAndSplitByPosition | 应用于Collection集合类型的bean字段 通过位置索引绑定 | required | 必须字段,默认为false.该字段为空抛异常 |
position | 位置索引 | ||
splitOn | |||
writeDelimiter | 元素之间的分隔符 | ||
collectionType | 集合类型 | ||
elementType | 元素类型 | ||
converter | 转换器 | ||
locale,capture,format | |||
@CsvDate | 应用于日期/时间类型的bean字段 必须与前四个注解中任意一个一起使用 | value | 日期格式,例如 yyyy-MM-dd |
@CsvNumber | 应用于数字类型的bean字段 必须与前四个注解中任意一个一起使用 | value | 数字格式,例如 000.### |
(1) CSVReaderNullFieldIndicator 空字段处理配置
方法 | 描述 |
EMPTY_SEPARATORS | null值 |
EMPTY_QUOTES | 空字符串 |
BOTH | 二者都是 |
NEITHER | 二者都不 |
3. 示例
(1) 数据写入CSV文件
List<String[]> list =new ArrayList();
list.add(new String[]{"A","B","C"});
OutputStreamWriter is = new OutputStreamWriter(new FileOutputStream("D:\\demo\\2.csv"), "utf-8");
ICSVWriter build = new CSVWriterBuilder(is).build();
build.writeAll(list,false);
build.flushQuietly();
OutputStreamWriter is = new OutputStreamWriter(new FileOutputStream("D:\\demo\\2.csv"), "utf-8");
ColumnPositionMappingStrategy<Entity> mapper = new ColumnPositionMappingStrategy<>();
mapper.setColumnMapping(new String[]{"f1", "f2", "f3"});//设置对应列的映射字段
mapper.setType(Entity.class);//设置实体类型
StatefulBeanToCsv<Entity> beanToCsv = new StatefulBeanToCsvBuilder(is).withMappingStrategy(mapper).build();
List<Entity> beans =new ArrayList<>();
beans.add(new Entity("A1","B1","C1"));
beanToCsv.write(beans);
is.close();
(2) 读取CSV文件
InputStreamReader is = new InputStreamReader(new FileInputStream("D:\\demo\\1.csv"), "utf-8");
CSVReader build = new CSVReaderBuilder(is).build();
Iterator<String[]> iterator = build.iterator();
while (iterator.hasNext()){
System.out.println(Arrays.toString(iterator.next()));
}
InputStreamReader is = new InputStreamReader(new FileInputStream("D:\\demo\\1.csv"), "utf-8");
ColumnPositionMappingStrategy<Entity> mapper = new ColumnPositionMappingStrategy<>();
mapper.setColumnMapping(new String[]{"f1", "f2", "f3"});//设置对应列的映射字段
mapper.setType(Entity.class);//设置实体类型
CsvToBean csvToBean = new CsvToBeanBuilder(is)
.withMappingStrategy(mapper)
.build();
List<Entity> parse = csvToBean.parse();
System.out.println(parse);
(3) 类型转换器
public class MyConverter<T> extends AbstractBeanField<T> {
@Override
protected Date convert(String value) {
return new Date();
}
}
(4) 过滤器
public class MyFilter implements CsvToBeanFilter {
@Override
public boolean allowLine(String[] line) {
//返回false时过滤掉该行
return true;
}
}