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);
}
}