侧边栏壁纸
博主头像
一朵云的博客博主等级

拥抱生活,向阳而生。

  • 累计撰写 67 篇文章
  • 累计创建 25 个标签
  • 累计收到 7 条评论

目 录CONTENT

文章目录

OpenCSV -- 基本使用

一朵云
2021-04-11 / 0 评论 / 2 点赞 / 7712 阅读 / 5712 字

基本介绍

  Opencsv 是 Apache 旗下,一个十分易用的Java 的 CSV(逗号分隔值)解析库,能协助我们更好操作 .csv 文件,需要 jdk1.8 及以上才能使用。

  官网地址:http://opencsv.sourceforge.net/

maven依赖

<!-- https://mvnrepository.com/artifact/com.opencsv/opencsv -->
<dependency>
    <groupId>com.opencsv</groupId>
    <artifactId>opencsv</artifactId>
    <version>5.6</version>
</dependency>

<!-- TestNG 依赖 -->
<dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>7.5</version>
</dependency>

<!-- lombok 注解 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.20</version>
</dependency>

读操作

  我个人倾向于使用bean实体类来对应csv文件的列名,以对象集合的方式接收文档内容。

1、csv 文本示例

image.png

2、编写实体类bean

package com.demo.easyexcel.data;

import com.opencsv.bean.CsvBindByPosition;
import lombok.*;

/**
 * @author xcj
 * csv文件的实体类
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CsvData {

    @CsvBindByPosition(position = 0)
    private String id;

    @CsvBindByPosition(position = 1)
    private String name;

    @CsvBindByPosition(position = 2)
    private String age;

}

3、读取csv文件内容

package com.demo.easyexcel.request;

import com.demo.easyexcel.data.CsvData;
import com.opencsv.bean.*;
import com.opencsv.exceptions.CsvDataTypeMismatchException;
import com.opencsv.exceptions.CsvRequiredFieldEmptyException;
import org.testng.annotations.Test;
import java.io.*;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;

/**
 * @author xcj
 * 基于opencsv的操作示例
 */
public class CsvTest {

    /**
     * 读取Csv文件示例
     * @throws IOException
     */
    @Test
    public void readCsvTest() throws IOException {
        String filePath = new File("").getCanonicalPath() + "\\src\\main\\resources\\test.csv";
        Path myPath = Paths.get(filePath);
        List<CsvData> beans = new CsvToBeanBuilder(new FileReader(filePath))
                .withType(CsvData.class).build().parse();
        for (CsvData data : beans) {
            System.out.println(data.toString());
        }
    }
}

4、效果

image.png

写操作

使用上面读操作的实体类,进行写操作,多次写入就拼接在文件末尾。

1、写入csv文件

package com.demo.easyexcel.request;

import com.demo.easyexcel.data.CsvData;
import com.opencsv.bean.*;
import com.opencsv.exceptions.CsvDataTypeMismatchException;
import com.opencsv.exceptions.CsvRequiredFieldEmptyException;
import org.testng.annotations.Test;
import java.io.*;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;

/**
 * @author xcj
 * 基于opencsv的操作示例
 */
public class CsvTest {

    /**
     * 写入Csv文件
     * @throws IOException
     * @throws CsvDataTypeMismatchException
     * @throws CsvRequiredFieldEmptyException
     */
    @Test
    public void writeCsvTest() throws IOException, CsvDataTypeMismatchException, CsvRequiredFieldEmptyException {

        //制造需写入csv的文件数据
        List<CsvData> list = new ArrayList<>();
        CsvData cd1 = new CsvData("6", "李四", "10");
        CsvData cd2 = new CsvData("7", "赵六", "17");
        CsvData cd3 = new CsvData("8", "陈七", "19");

        Collections.addAll(list,cd1,cd2,cd3);

        String FilePath = "D:\\demo\\easyexcel\\src\\main\\resources\\Test2.csv";
        try(Writer writer = new FileWriter(FilePath, true)){
            StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder(writer).build();
            beanToCsv.setOrderedResults(true);

            //判断文件为空时,添加首行
            File file = new File(FilePath);
            if (file == null || file.length() == 0 || !file.exists()) {
                beanToCsv.write(new CsvData("id", "name", "age"));
            }

            beanToCsv.write(list);
        }
    }
}

2、效果:

image.png

2

评论区