使用EasyExcel实现CSV文件读写功能

2022-11-10 08:58:45 浏览数 (1)

1、Idea创建SpringBoot工程:

如图:

在这里插入图片描述在这里插入图片描述

选择Spring Init

设置groupid等信息,选择jdk版本,其他可以默认;

使用默认方法创建工程时,有时候会报连接超时的错误;

这时候需要修改一下serverURL;(这个不是必须的)

在这里插入图片描述在这里插入图片描述

生成的工程目录如下:

在这里插入图片描述在这里插入图片描述

由于maven仓库在外网,网络连接较慢,推荐设置国内的源;最常用的就是上面的配置;

至此。一个工程就搭建完成了;

2、CSV文件解析

EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。在3.0.0-beta1版本开始支持,读的时候会自动判断,和读Excel一样。但是在写的时候需要指定excelType为CSV;

easyexcel官网地址:在这里

GitHub源码地址,直达

目前easyexcel的最新版本是3.1.1

首先是引入依赖:

在build.gradle新增一行

implementation 'com.alibaba:easyexcel:3.1.1'

项目需求:

有两个csv文件,其他一个文件是多条记录信息,另外一个文件是一条记录对应多条属性;需要把两个文件合并成一个文件中;

实现思路:

分别读取两个csv文件,将一对多的读取数据为map,通过遍历第一个文件的数据列表,获取一对多属性,然后写入到一个文件中;

实现步骤:

  • 读取第一个文件:

使用最简单的读文件方式,声明一个内部监听类,读取所以数据到列表

代码语言:java复制
 public static List<RundownMo> readRd(String filePath){
        List<RundownMo> rdList = new ArrayList<>();
        EasyExcel.read(filePath, RundownMo.class, new ReadListener<RundownMo>() {
            @Override
            public void invoke(RundownMo data, AnalysisContext context) {
                rdList.add(data);
            }

            @Override
            public void doAfterAllAnalysed(AnalysisContext context) {
                System.out.println(rdList.size());
            }
        }).charset(Charset.forName("UTF-8")).sheet().doRead();
        return rdList;
    }

需要注意的是,在读取有中文的csv文件时,可能会出现乱码的情况,这时候,需要调用charset函数设置字符集;

  • 读取第二文件

更简单的读文件方式,分页读取,默认是100行;

代码语言:java复制
public static List<RundownTitleMo> readRt(String filePath){
        List<RundownTitleMo> rtList = new ArrayList<>();
        EasyExcel.read(filePath, RundownTitleMo.class,
                new PageReadListener<RundownTitleMo>(datalist ->{
                    //System.out.println(datalist.size() "=");
                    rtList.addAll(datalist);
                })).sheet().doRead();
        //System.out.println(rtList.size() "==");
        return rtList;
    }

对读取的列表分组:使用stream

代码语言:txt复制
//分组
    public static Map<String,List<RundownTitleMo>> group(List<RundownTitleMo> rtList){
        // id分组
       Map<String,List<RundownTitleMo>> map = rtList.stream().collect(Collectors.groupingBy(t -> t.getRId()));
       return map;
    }
  • 写文件:

将之前获取的数据组件成list,写入csv;

代码语言:java复制
public static void writeRdt(String filePath, List<WriteMo> datas){
        EasyExcel.write(filePath, WriteMo.class)
                .excelType(ExcelTypeEnum.CSV)
                .sheet("data")
                .doWrite(datas);
    }

model使用了lombok;并设置了标题信息

代码语言:txt复制
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@EqualsAndHashCode
public class WriteMo{

    @ExcelProperty("ID")
    private String rId;

    @ExcelProperty("名称")
    private String name; //名称

    @ExcelProperty("创建者")
    private String creator; //创建者


}

引入lombok:

compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok'

3、集成swagger3

引入依赖:

implementation 'io.springfox:springfox-boot-starter:3.0.0'

启动类添加:@EnableOpenApi

启动后swagger地址为:http://ip:port/swagger-ui/

完整的build.gradle
代码语言:txt复制
plugins {
    id 'org.springframework.boot' version '2.7.4'
    id 'io.spring.dependency-management' version '1.0.15.RELEASE'
    id 'org.asciidoctor.convert' version '1.5.8'
    id 'java'
}

group = 'com.csv'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    maven {
        allowInsecureProtocol = true
        name 'Aliyun Maven Repository'
        url "http://maven.aliyun.com/nexus/content/groups/public/"
    }
    mavenCentral()
}

ext {
    set('snippetsDir', file("build/generated-snippets"))
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'

    implementation 'com.alibaba:easyexcel:3.1.1'
    implementation 'io.springfox:springfox-boot-starter:3.0.0'

    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc'
}

tasks.named('test') {
    outputs.dir snippetsDir
    useJUnitPlatform()
}

tasks.named('asciidoctor') {
    inputs.dir snippetsDir
    dependsOn test
}

0 人点赞