OpenCSV 实现CSV的导入导出

本文将介绍以下内容

  • 快速实现CSV的导入导出
  • 可以通过position方式、header名称注解形式、列名指定形式导入导出CSV文件,自定义类型转换

如何读取?

  • 以下都通过实体注解形式实现,依托java+springboot
//=======================================Position==================================//
//通过position形式
//实体内的注解,基于position
   @CsvBindByPosition(position = 0)
    @Excel(isWrap = false,name = "样例",orderNum = "1",width = 30)
    private String demo;

 public static <T> List<T> readDataFromLocalPathWithPosition(Class<T> clazz, String filePath) {
        List<T> parseResult = new ArrayList<>();
        if (FileUtils.checkFileExist(filePath)) {
            ColumnPositionMappingStrategy<T> mapper = new ColumnPositionMappingStrategy<>();
            mapper.setType(clazz);
            try {
                CsvToBean<T> csvToBean = new CsvToBeanBuilder<T>(new FileReader(filePath))
                        .withMappingStrategy(mapper)
                        .withSeparator(DEFAULT_BIZ_SEPERATOR)
                        .build();
                parseResult = csvToBean.parse();
            } catch (FileNotFoundException e) {
                log.error("[CsvUtils][readDataFromLocalPathWithPosition] meet error when convert csv to java bean ,file path :", filePath);
                log.error("[CsvUtils][readDataFromLocalPathWithPosition]",e);
            }
        }
        if(CollectionUtils.isNotEmpty(parseResult)){
            return parseResult;
        }
        return Collections.emptyList();
    }

//=======================================Header==================================//
    @CsvCustomBindByName(column = "num",converter = ConvertCsvStringToLong.class)
    @Excel(isWrap = false,name = "人数",orderNum = "4",width = 20)
    private Long num;
    //ConvertCsvStringToLong是自定义的类型转换,仅需要继承AbstractBeanField即可,自行实现类型的转换
    public class ConvertCsvStringToLong<T, I>   extends AbstractBeanField<T, I> {

    @Override
    protected Object convert(String s) throws CsvDataTypeMismatchException, CsvConstraintViolationException {
        return StringUtils.isNotBlank(s)?Long.valueOf(s):0L;
    }
}
//以下读取时指定编码UTF-8,建议读取和写入的时候统一指定编码,避免出现中文乱码
    public static <T> List<T> readDataFromLocalPathWithHeader(Class<T> clazz, String filePath) {
        List<T> parseResult = new ArrayList<>();
        if (FileUtils.checkFileExist(filePath)) {
            HeaderColumnNameMappingStrategy<T> headerColumnNameMappingStrategy = new HeaderColumnNameMappingStrategy<>();
            headerColumnNameMappingStrategy.setType(clazz);
            FileInputStream fin = null;
            InputStreamReader reader = null;
            try {
                fin= new FileInputStream(filePath);
                reader =  new InputStreamReader(fin, StandardCharsets.UTF_8);
                CsvToBean<T> csvToBean = new CsvToBeanBuilder<T>(reader)
                        .withMappingStrategy(headerColumnNameMappingStrategy)
                        .withSeparator(DEFAULT_BIZ_SEPERATOR)
                        .build();
                parseResult = csvToBean.parse();
            } catch (FileNotFoundException e) {
                log.error("[CsvUtils][readDataFromLocalPathWithHeader] meet error when convert csv to java bean ,file path :", filePath);
                log.error("[CsvUtils][readDataFromLocalPathWithHeader]",e);
            }finally {
                try {
                    if (reader != null) {
                        reader.close();
                    }
                    if (fin != null) {
                        fin.close();
                    }
                }catch (Exception e){
                    log.error("[CsvUtils][readDataFromLocalPathWithHeader]fail to close stream for csv",e);
                }
            }
        }
        if(CollectionUtils.isNotEmpty(parseResult)){
            return parseResult;
        }
        return Collections.emptyList();
    }

如何写入?

  • 以下都通过实体注解形式实现,依托java+springboot
 public static<T>void writeDataToCsvFile(List<T> dataList,Class<T> clazz, String finalPath) {
        try {
            Writer writer = new FileWriter(finalPath);
            // 手动加上BOM标识
            writer.write(new String(new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF }));

            // 设置显示的顺序
            ColumnPositionMappingStrategy<T> mapper = new ColumnPositionMappingStrategy<T>();
            mapper.setType(clazz);

            // 写表头
            CSVWriter csvWriter = new CSVWriter(writer);

            StatefulBeanToCsv<T> beanToCsv = new StatefulBeanToCsvBuilder<T>(writer)
                    .withMappingStrategy(mapper)
                    .withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)
                    .withSeparator(DEFAULT_BIZ_SEPERATOR)
                    .withEscapechar('\\').build();
            beanToCsv.write(dataList);
            csvWriter.close();
            writer.close();
        } catch (IOException | CsvDataTypeMismatchException | CsvRequiredFieldEmptyException e) {
           log.error("[CsvUtils][readModelDataFromLocalPathWithHeader] fail to write data into csv file ,",e);
        }
       log.info("[CsvUtils][readModelDataFromLocalPathWithHeader]write to csv file successfully ,local path is "+finalPath);
    }

更多可参考

csv文件处理——Opencsv

其他

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java 中可以使用开源库 Apache Commons CSV实现 CSV导入导出。以下是一个简单的示例代码,演示如何在 Java 中使用 Apache Commons CSV导入导出 CSV 文件: 导入 CSV 文件示例代码: ```java import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVParser; import org.apache.commons.csv.CSVRecord; public class CSVReader { public static void main(String[] args) { String csvFile = "data.csv"; try (BufferedReader br = new BufferedReader(new FileReader(csvFile)); CSVParser parser = new CSVParser(br, CSVFormat.DEFAULT)) { for (CSVRecord record : parser) { String id = record.get(0); String name = record.get(1); String age = record.get(2); // 处理 CSV 数据 // ... } } catch (IOException e) { e.printStackTrace(); } } } ``` 导出 CSV 文件示例代码: ```java import java.io.FileWriter; import java.io.IOException; import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVPrinter; public class CSVWriter { public static void main(String[] args) { String csvFile = "data.csv"; try (FileWriter writer = new FileWriter(csvFile); CSVPrinter printer = new CSVPrinter(writer, CSVFormat.DEFAULT)) { printer.printRecord("1", "John", "Doe"); printer.printRecord("2", "Jane", "Doe"); printer.printRecord("3", "Bob", "Smith"); } catch (IOException e) { e.printStackTrace(); } } } ``` 在实际的应用中,需要根据实际需求进行修改和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c_zyer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值