CSV導入導出簡單的工具類

CSV導入導出簡單的工具類


import com.google.common.collect.Lists;
import com.opencsv.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.io.Charsets;
import org.apache.commons.io.input.CharSequenceReader;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.entity.ContentType;
import org.springframework.web.multipart.MultipartFile;
import com.zgd.demo.MyBizException;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Slf4j
public class CsvHelper {


  public static List<String[]> readAll(MultipartFile file, int skipRow) throws IOException {
    if (file == null) {
      return null;
    }
    String contentType = file.getContentType();
    if (!StringUtils.containsIgnoreCase(contentType, "vnd.ms") && !StringUtils.containsIgnoreCase(contentType, "csv")){
        throw new MyBizException("解析文件失敗,不是csv格式的文件");
    }
    return readAll(new CharSequenceReader(convertOriginArray(file.getBytes())), skipRow);
  }

  public static List<String[]> readAll(Reader reader, int skipRow) {
    CSVParser parser = new CSVParserBuilder()
            .withSeparator(',')
            .withIgnoreQuotations(true)
            .build();

    CSVReader csvReader = new CSVReaderBuilder(reader)
            .withSkipLines(skipRow)
            .withCSVParser(parser)
            .build();

    List<String[]> list = new ArrayList<>();
    try {
      list = csvReader.readAll();
    } catch (Exception ex) {
      log.error("異常: ", ex);
    }finally {
      try {
        reader.close();
        csvReader.close();
      } catch (IOException e) {
        log.error("關閉流失敗: ", e); 
      }
    }
    return list;
  }

  public static List<String[]> readOneByOne(Reader reader,int skipRow) {
    List<String[]> list = new ArrayList<>();
    CSVReader csvReader = null;
    try {
      CSVParser parser = new CSVParserBuilder()
              .withSeparator(',')
              .withIgnoreQuotations(true)
              .build();

      csvReader = new CSVReaderBuilder(reader)
              .withSkipLines(skipRow)
              .withCSVParser(parser)
              .build();

      String[] line;
      while ((line = csvReader.readNext()) != null) {
        list.add(line);
      }
    } catch (Exception ex) {
      log.error("異常: ", ex);
    }  finally {
    try {
      reader.close();
      if (csvReader != null) {
        csvReader.close();
      }
    } catch (IOException e) {
      log.error("關閉流失敗: ", e);
    }
  }
    return list;
  }

  public static void csvWriterOneByOne(List<String[]> stringArray, String fileName) {
    try (  CSVWriter writer = new CSVWriter(new FileWriter(fileName))){
      for (String[] array : stringArray) {
        writer.writeNext(array);
      }
    } catch (Exception ex) {
      log.error("異常: ", ex);
    }
  }

  public static void csvWriterAll(List<String[]> stringArray, String fileName) {
    try (  CSVWriter writer = new CSVWriter(new FileWriter(fileName))){
      writer.writeAll(stringArray);
    } catch (Exception ex) {
      log.error("異常: ", ex);
    }
  }

  public static void csvWriter2Stream(List<String[]> stringArray, OutputStream os) {
    try (  CSVWriter writer = new CSVWriter(new OutputStreamWriter(os))){
      for (String[] array : stringArray) {
        writer.writeNext(array);
      }
    } catch (Exception ex) {
      log.error("異常: ", ex);
    }
  }


  private static String convertOriginArray(byte[] initialArray) {
    String bufferStringOne = new String(initialArray, StandardCharsets.UTF_8);
    String bufferStringTwo = new String(initialArray, Charsets.toCharset("GBK"));
    String bufferStringThree = new String(initialArray, Charsets.toCharset("GB18030"));
    String bufferStringFour = new String(initialArray, Charsets.toCharset("ISO-2022-CN"));
    List<String> result = Lists.newArrayList(bufferStringOne, bufferStringTwo, bufferStringThree, bufferStringFour).stream().filter(str -> str.contains("費用項目")).collect(Collectors.toList());
    if (CollectionUtils.isEmpty(result)) {
      throw new MyBizException("解析文件失敗.請填寫上傳正確的模板");
    }
    return result.get(0);
  }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章