当前位置: 首页 > 工具软件 > openCSV > 使用案例 >

csv导入导出(opencsv)

壤驷鸿
2023-12-01

1. maven

<dependency>
     <groupId>com.opencsv</groupId>
     <artifactId>opencsv</artifactId>
     <version>4.6</version>
</dependency>

2. 基础API

2.1 构建器相关

(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对象

2.2 其他类

(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,.....

2.3 对象映射策略

(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)

获取与设置列映射

2.4 注解

方法 描述属性描述
@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.###

2.5 常用常量

(1)  CSVReaderNullFieldIndicator 空字段处理配置

方法描述
EMPTY_SEPARATORSnull值
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;
        }
    }

 

 类似资料: