CSV(Comma-Separated Values,逗号分隔的值)是一种简单、实用的文件格式,用于存储和表示包括文本、数值等各种类型的数据。CSV 文件通常以 .csv
作为文件扩展名。这种文件格式的一个显著特点是:文件内的数据以逗号 ,
分隔,呈现一个表格形式。CSV 文件已广泛应用于存储、传输和编辑数据。
,
,也可以使用空格等其他字符,代表不同的数据。经过测试,好像只有逗号分隔的csv文件才能在Excel中正常解析。'
或双引号 "
)将这个数据包围起来,防止误认为是两个不同数据。例如:
姓名,年龄,性别
张三,25,男
李四,28,男
王五,22,女
<dependency>
<groupId>com.univocitygroupId>
<artifactId>univocity-parsersartifactId>
<version>2.9.1version>
dependency>
/**
* csv文件导出
*
* @param data 导出数据
* @param file 导出目的文件
* @param separator 分割符
* @param clazz 导出对象
* @param 数据对象泛型
*/
public static <T> void export(Collection<T> data, File file, String separator, Class<T> clazz) {
try {
CsvWriterSettings settings = new CsvWriterSettings();
//设置分隔符
CsvFormat csvFormat = new CsvFormat();
csvFormat.setDelimiter(separator);
settings.setFormat(csvFormat);
settings.setHeaderWritingEnabled(false);
settings.setRowWriterProcessor(new BeanWriterProcessor<>(clazz));
CsvWriter writer = new CsvWriter(Files.newOutputStream(file.toPath()), "utf-8", settings);
// 写入header
writer.writeHeaders(settings.getHeaders());
data.forEach(writer::processRecord);
writer.close();
} catch (Exception e) {
log.error("export .csv file failed. message.", e);
}
}
测试:
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public static class User implements Serializable {
@Parsed
private String name;
@Parsed
private Integer age;
}
public static void main(String[] args) {
User user1 = new User("张三", 18);
User user2 = new User("李四", 19);
List<User> users = Arrays.asList(user1, user2);
File file = new File("E:\\test.csv");
CsvUtil.export(users, file, ",", User.class);
}
结果:
Excel支持打开.csv文件:
文本编辑器中打开:
/**
* 读取crv文件并转换成List
*
* @param separator crv文件分隔符
* @param file 待读取文件
* @return crv对象list
*/
public static <T> List<T> read(String separator, File file, Class<T> clazz) {
List<T> result = Collections.emptyList();
try {
BeanListProcessor<T> rowProcessor = new BeanListProcessor<>(clazz);
//设置分隔符
CsvFormat csvFormat = new CsvFormat();
csvFormat.setDelimiter(separator);
CsvParserSettings parserSettings = new CsvParserSettings();
parserSettings.setProcessor(rowProcessor);
parserSettings.setFormat(csvFormat);
CsvParser parser = new CsvParser(parserSettings);
InputStream in = Files.newInputStream(file.toPath());
parser.parse(in);
//逐行读取
result = rowProcessor.getBeans();
} catch (Exception e) {
log.error("Import csv file failed. message: ", e);
}
return result;
}
测试:
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public static class User implements Serializable {
@Parsed
private String name;
@Parsed
private Integer age;
}
public static void main(String[] args) {
File file = new File("E:\\test.csv");
List<User> users = CsvUtil.read(",", file, User.class);
users.forEach(System.out::println);
}
结果:
总结:.csv文件导入导出比较简单,需要注意的地方有:
@Parsed
注解。new CsvFormat()
进行设置,默认使用的就是英文逗号作为分隔符。