JAVA通过Hutool解析CSV文件
Java解析CSV方式有很多种方式【javaCSV(未更新),openCSV(apache)】,这篇文章主要是用到Hutool工具类,能快速的解析读取,不需要过多的封装。
开箱即用!
导入依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.10</version>
</dependency>
首先看下本地CSV文件的处理
1.导出到本地路径路径
String path2 = "/Users/jeckwu/Desktop/test/test.csv";
// 导出csv文件到指定路径
@Test
public void exportDataToCsvFileOfPath(){
List<TILockdataMidModel> allLockData = tiLockdataMidMapper.getAllLockData();
// 业务处理
// 可以把list转map
//指定路径和编码
CsvWriter writer = CsvUtil.getWriter(path2, CharsetUtil.CHARSET_UTF_8);
//按行写出
writer.writeBeans(allLockData);
}
2.解析本地路径下的CSV文件
// 解析本地csv文件
@Test
public void analysisLocalCsvFileByPath(){
final CsvReader reader = CsvUtil.getReader();
//假设csv文件在classpath目录下
final List<TILockdataMidModel> result = reader.read(
ResourceUtil.getUtf8Reader(path2), TILockdataMidModel.class);
log.info("====>{}",result.size());
log.info("====>{}", JSON.toJSONString(result));
}
页面上的CSV文件导入导出处理
3.Web端导入且解析CSV文件
// 读取csv中的数据
public static List<Map<String,Object>> csvImport(MultipartFile file) throws IOException {
//2. 进行配置
CsvReadConfig csvReadConfig=new CsvReadConfig();
// 是否跳过空白行
csvReadConfig.setSkipEmptyRows(true);
// 是否设置首行为标题行
csvReadConfig.setContainsHeader(true);
//构建 CsvReader 对象
CsvReader csvReader = CsvUtil.getReader(csvReadConfig);
// 这里转了下 可能会产生临时文件,临时文件目录可以设置,也可以立马删除
CsvData read = csvReader.read(multipartFile2File(file), CharsetUtil.CHARSET_GBK);
List<Map<String,Object>> mapList = new ArrayList<>();
List<String> header = read.getHeader();
List<CsvRow> rows = read.getRows();
for (CsvRow row : rows) {
Map<String,Object> map = new HashMap<>();
for (int i = 0; i < row.size(); i++) {
map.put(header.get(i),row.get(i));
}
// 具体业务根据需求来就行了
if (!ObjectUtils.isEmpty(map.get("mlos单号")))
mapList.add(map);
}
return mapList;
}
/**
* multipartFile转File
**/
public static File multipartFile2File(MultipartFile multipartFile){
File file = null;
if (multipartFile != null){
try {
file=File.createTempFile("tmp", null);
multipartFile.transferTo(file);
System.gc();
file.deleteOnExit();
}catch (Exception e){
e.printStackTrace();
log.warn("multipartFile转File发生异常:"+e);
}
}
return file;
}
4.Web端导出CSV文件
@RequestMapping("/exportCsvFileTest")
public void exportCsvFileTest(HttpServletResponse response) throws IOException {
// 获取业务数据 一般放到service处理
List<TILockdataMidModel> allLockData = tiLockdataMidMapper.getAllLockData();
// 业务处理完成把数据写到流中 响应到页面上
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition", "attachment;filename=" + new String("exportCsvFileTest.csv".getBytes(StandardCharsets.UTF_8), "ISO8859-1"));
response.setContentType(ContentType.APPLICATION_OCTET_STREAM.toString());
CsvWriter csvWriter = CsvUtil.getWriter(response.getWriter());
csvWriter.writeBeans(allLockData);
csvWriter.close();
}
详细的API可以去看官方文档,Hutool官网:https://www.hutool.cn/
如果需求比较复杂可以尝试openCSV。