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,通过遍历第一个文件的数据列表,获取一对多属性,然后写入到一个文件中;
实现步骤:
- 读取第一个文件:
使用最简单的读文件方式,声明一个内部监听类,读取所以数据到列表
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行;
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
//分组
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;
public static void writeRdt(String filePath, List<WriteMo> datas){
EasyExcel.write(filePath, WriteMo.class)
.excelType(ExcelTypeEnum.CSV)
.sheet("data")
.doWrite(datas);
}
model使用了lombok;并设置了标题信息
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
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
}