JAVA通过Hutool解析CSV文件【导入即用,无需封装】

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。


版权声明:本文为Jeck_wu原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。