前言
一直都觉得csv操作比较复杂,今天刚知道插件unicocity-parsers处理csv这么简单,所以记录一下
1.引入univocity
代码如下(示例):
<dependency>
<groupId>com.univocity</groupId>
<artifactId>univocity-parsers</artifactId>
<version>2.8.4</version>
</dependency>
2.读取csv,将csv转成List文件
代码如下(示例):
public static <T> List parseCsvFile(MultipartFile file) {
CsvParserSettings settings = new CsvParserSettings();
// 默认会对列重新排序
// 禁用后,所有列会按照文件中定义的顺序输出
// 未选择的字段不会解析,输出null
settings.setColumnReorderingEnabled(false);
// csv文件有头信息
settings.setHeaderExtractionEnabled(true);
// 换行方式
settings.getFormat().setLineSeparator("\n");
// 为每个指定配置创建一个解析器实例
CsvParser parser = new CsvParser(settings);
InputStreamReader reader = new InputStreamReader(file.getInputStream(), "UTF-8");
// 送入列处理器
parser.parse(reader);
// 最后,得到列解析的值
List<T> dataList = rowProcessor.getBeans();
return dataList;
}
3.创建csv文件
代码如下(示例):
public static File createCsvFile(String[] header, List<Object> data, String fileName) {
CsvWriter csvWriter = null;
try
{
File csvFile = new File(fileName);
File parent = csvFile.getParentFile();
if (parent != null && !parent.exists())
{
parent.mkdirs();
}
csvFile.createNewFile();
Writer fileWriter = new FileWriter(csvFile);
CsvWriterSettings settings = new CsvWriterSettings();
settings.getFormat().setLineSeparator("\n");
CsvWriter writer = new CsvWriter(fileWriter, settings);
// 创建csv头部信息
writer.writeHeaders(header);
// 生成数据
writer.processRecords(data);
return csvFile;
} catch (Exception ex) {
throw ex;
} finally {
if (writer!= null) {
writer.close();
}
}
}
如果想在浏览器直接下载csv,就不需要生成csv文件,只需要生成文件流
代码如下(示例):
public static byte[] createCsv(String[] header, List<Object> data, String fileName) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
CsvWriter csvWriter = null;
try {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(baos, StandardCharsets.UTF_8)));
Writer fileWriter = new FileWriter(csvFile);
CsvWriterSettings settings = new CsvWriterSettings();
settings.getFormat().setLineSeparator("\n");
CsvWriter writer = new CsvWriter(bw , settings);
// 创建csv头部信息
writer.writeHeaders(header);
// 生成数据
writer.processRecords(data);
bw.flush();
bw.close();
return baos.toByteArray();
} catch (Exception ex) {
throw ex;
} finally {
if (writer!= null) {
writer.close();
}
}
}