当前位置:网站首页>开发技术-使用easyexcel导入文件(简单示例)
开发技术-使用easyexcel导入文件(简单示例)
2022-06-30 20:35:00 【JustDI-CM】
目录
1.引入依赖
pom 文件中增加 easyexcel 依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.0.0</version>
</dependency>2.实体类
实体类中的字段和要导入的表格中的列是一一对应的。
import com.alibaba.excel.annotation.ExcelProperty;
public class TestImport {
@ExcelProperty(value = "序号", index = 0)
private String id;
@ExcelProperty(value = "姓名", index = 1)
private String name;
@ExcelProperty(value = "年龄", index = 2)
private String age;
public TestImport() {
}
public TestImport(String id, String name, String age) {
this.id = id;
this.name = name;
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "TestImport{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}
3.业务处理类
接口
import 你的路径.TestImport;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
public interface FileService {
void dealFile(MultipartFile file);
void save(List<TestImport> list);
}
实现类
import com.alibaba.excel.EasyExcel;
import 你的路径.TestImport;
import 你的路径.FileListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
@Component
public class FileServiceImpl implements FileService {
private static final Logger LOGGER = LoggerFactory.getLogger(FileServiceImpl.class);
@Autowired
private FileService fileService;
@Override
public void dealFile(MultipartFile file) {
InputStream is = null;
try {
is = file.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
//1.进行读取数据,TestImport是我的pojo类,
//2.new SorageListener(storageService)这个是监听器,主要用来读取数据的,别急后面会讲
//3.特别注意的是storageService这个service,我上面有注入进去 @Autowired,切记不要new会报错
EasyExcel.read(is, TestImport.class, new FileListener(fileService)).sheet().doRead();
}
@Override
public void save(List<TestImport> list) {
LOGGER.info("落库开始------");
// 编写落库逻辑,此处省略了
}
}
4.监听类
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import 你的路径.FileService;
import 你的路径.FileServiceImpl;
import 你的路径.TestImport;
import org.springframework.stereotype.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
@Component
public class FileListener extends AnalysisEventListener<TestImport> {
private static final Logger LOGGER = LoggerFactory.getLogger(FileListener.class);
//读取数据初始化值
private static final int BATCH_COUNT = 50;
List<TestImport> list = new ArrayList<>();
private FileService fileService;
public FileListener() {
fileService =new FileServiceImpl();
}
public FileListener(FileService fileService) {
this.fileService = fileService;
}
/**
* 这个每一条数据解析都会来调用,数据是一条一条进行解析的
*
* @param data one row value. Is is same as {@link AnalysisContext#readRowHolder()}
* @param context
*/
@Override
public void invoke(TestImport data, AnalysisContext context) {
LOGGER.info("invoke---开始解析表格数据");
list.add(data);
// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
if (list.size() >= BATCH_COUNT) {
LOGGER.info("invoke---超过设定值,导入数据库");
saveData();
// 存储完成清理 list
list.clear();
}
}
/**
* 所有excel表中数据解析完成了 都会来调用这个
* 解释为什么要保存数据?
*初始化读取数量为50,表中信息已经加载完毕,,
* 假设excel表中最后只剩下30行遗留数据,所以为了防止存在遗留数据 尽量判断下集合是否为空,
* 不为空在进行存储(这是我的逻辑需要判断,如果不需要也可进行不判断)
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
LOGGER.info("doAfterAllAnalysed---开始处理");
if(list.size()==0){
return;
}
saveData();
LOGGER.info("所有数据解析完成!");
}
/**
* 加上存储数据库
*/
public void saveData() {
//代码实现类层保存数据
fileService.save(list);
LOGGER.info("存储数据库成功!");
}
}
5.controller
//excel批量导入数据
@PostMapping(value = "/import")
public T storageService(@RequestParam("file") MultipartFile file) {
T t= new T();
try {
fileService.dealFile(file);
} catch (Exception e) {
return t;
}
return t;
}
// 这个 T 是返回类型6.postman 测试

7.说明
通过输出的日志看,请求进来后,业务处理类调用 dealFile() 执行 EasyExcel.read ,然后进入到监听类中,先执行 invoke() 再执行 doAfterAllAnalysed()

写这个权作记录
边栏推荐
- Lumiprobe dye hydrazide - BDP FL hydrazide solution
- Is it safe to open an account for online stock trading!?
- C文件指针
- jfinal中如何使用过滤器监控Druid监听SQL执行?
- 数据库 OLAP、OLTP是什么?相同和不同?适用场景
- Lumiprobe染料 NHS 酯丨BDP FL NHS 酯研究
- Jerry's determination of detection sensitivity level [chapter]
- Go学习笔记
- C file pointer
- Common questions and answering skills of project manager interview
猜你喜欢

Evolution of screen display technology

B_QuRT_User_Guide(32)

树基本概念

《大厂面试》之JVM篇21问与答

Lumiprobe protein quantitation - qudye Protein Quantitation Kit

Lvalue reference and lvalue reference

阿里kube-eventer mysql sink简单使用记录

关于,奇安信检测代码漏洞,XSS系列解决

maya房子建模

By analyzing more than 7million R & D needs, it is found that these eight programming languages are the most needed by the industry
随机推荐
Common questions and answering skills of project manager interview
1、生成对抗网络入门
Installation and use of securecrtportable
Failed to configure a DataSource: ‘url‘ attribute is not specified and no embedded datasource could
What are database OLAP and OLTP? Same and different? Applicable scenarios
maya房子建模
NLP paper lead reading | what about the degradation of text generation model? Simctg tells you the answer
Study on PEGylation of lumiprobe and PEG linker - iodine-peg3-acid
【数字IC应届生职业规划】Chap.1 IC行业产业链概述及代表企业大厂汇总
uniapp-生命周期/路由跳转
SQL优化
判断js对象是否为空的方式
Study on lumiprobe dye NHS ester BDP FL NHS ester
树基本概念
Lvalue reference and lvalue reference
centos——开启/关闭oracle
Comparison between QT and other GUI Libraries
Jerry's long press reset [chapter]
断点续传和下载原理分析
有趣插件汇总