使用EasyExcel实现CSV文件读写功能
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
}
相关文章
- 操作系统文件使用磁盘的实现---20
- 基于开源方案构建统一的文件在线预览与office协同编辑平台的架构与实现历程
- 通过S3协议实现通用的文件存储服务中间件
- 前端必读3.0:如何在 Angular 中使用SpreadJS实现导入和导出 Excel 文件
- 使用Python批量实现文件夹及其子文件夹下指定文件的复制
- 独家|OpenCV1.8 使用XML和YAML文件实现文件的输入/输出
- 数据库开发知识:SpringBoot 怎么集成MongoDB实现文件上传功能
- java实现文件下载功能代码详解编程语言
- 文件Linux 使用 SCP 实现远程文件传输的排除方法(linuxscp排除)
- Linux文件内存映射:实现高性能存取(linux文件内存映射)
- Linux线程实现文件锁机制(linux线程文件锁)
- 使用Linux文件同步命令实现数据同步(linux文件同步命令)
- MongoDB实现大文件存储的技术优势(mongodb大文件存储)
- 符Linux CP命令指南:使用提示符实现文件复制(linuxcp提示)
- 轻松实现Linux文件同步:学会使用SCP命令(linuxscp同步)
- 使用Linux Sync用户实现文件同步,让你的文件备份更加可靠(linuxsync用户)
- ASP.NET 大文件下载的实现思路及代码
- Linux中的cp命令:实现快速文件复制(linux中的复制命令)
- 文件Linux下实现快速文件同步(linux下同步)
- Oracle实现的文件共享服务(oracle 共享文件)
- 实现MySQL从json文件快速导入(.json导入mysql)
- MySQL上传文件的实现方法(mysql上传文件语句)
- c#共享状态的文件读写实现代码
- 使用java实现http多线程断点下载文件(一)
- struts2中实现多个文件同时上传代码
- 使用HttpHead方法获取文件长度的实现方法详解
- Java使用jxl包写Excel文件适合列宽实现
- c#使用简单工厂模式实现生成html文件的封装类分享
- java实现服务器文件打包zip并下载的示例(边打包边下载)
- jQuery不使用插件及swf实现无刷新文件上传
- PHP中使用glob函数实现一句话删除某个目录下的所有文件
- apache使用.htaccess文件实现屏蔽wget下载网站内容