官网解释:
Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到KB级别,并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单方便
简单来说就是对excel的读写操作
演示过程
1.导入maven依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.1</version>
</dependency>
2.实现简单的读写操作
写入操作:
@Data
public class DemoData {
//设置excel表头名称
@ExcelProperty(value = "学生编号",index = 0)
private Integer sno;
@ExcelProperty(value = "学生姓名",index = 1)
private String sname;
}
public static void main(String[] args) {
//实现excel写的操作
//1 设置写入文件夹地址和excel文件名称
String filename = "E:\\write.xlsx";
//2 调用easyexcel里面的方法实现写操作
//write方法两个参数:第一个参数文件路径名称,第二个参数实体类class
EasyExcel.write(filename,DemoData.class).sheet("学生列表").doWrite(getData());
}
doWriter参数是一个list集合,所有我们需要创建一个list集合,将集合写入到excel中
private static List<DemoData> getData() {
List<DemoData> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
DemoData data = new DemoData();
data.setSno(i);
data.setSname("lucy"+i);
list.add(data);
}
return list;
}
打开excel查看插入成功
读操作:
读操作是调用read方法,并且要传入一个ReadListener参数
//实现excel读操作
String filename = "E:\\write.xlsx";
EasyExcel.read(filename,DemoData.class,new ExcelListener()).sheet().doRead();
自己写一个监听器,继承AnalysisEventListener,查看源码可知AnalysisEventListener实现了ReadListener接口
//一行一行读取excel内容
@Override
public void invoke(DemoData data, AnalysisContext analysisContext) {
System.out.println("****"+data);
}
//读取表头内容
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
System.out.println("表头:"+headMap);
}
//读取完成之后
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) { }
}
运行
使用easyexcel连接数据库实现读写操作,实现分类
1.创建一个分类的excel文件,可以手动创建,也可以使用代码进行操作
这里我使用代码进行插入
@Test
public void test() {
/*
1.创建一个文件
*/
String filename = "E:\\category.xlsx";
EasyExcel.write(filename, CategoryExcel.class).sheet("分类管理").doWrite(getList());
}
public static List<CategoryExcel> getList(){
List<CategoryExcel> list=new ArrayList<>();
CategoryExcel categoryExcel = new CategoryExcel("java学习","java编程");
CategoryExcel categoryExcel2 = new CategoryExcel("java学习","javaweb");
CategoryExcel categoryExcel3 = new CategoryExcel("框架","spring");
CategoryExcel categoryExcel4 = new CategoryExcel("框架","springmvc");
CategoryExcel categoryExcel5= new CategoryExcel("框架","mybatis");
list.add(categoryExcel);
list.add(categoryExcel2);
list.add(categoryExcel3);
list.add(categoryExcel4);
list.add(categoryExcel5);
return list;
}
插入完成
现在将数据插入到数据库中
1.创建一个saveCategory方法进行操作
@Autowired
private CategoryService categoryService;
@Test
void contextLoads() {
/*
2.把excel的数据信息存储到数据库里面
*/
File file=new File("E:\\category.xlsx");
categoryService.saveCategory(file,categoryService);
}
saveCategory方法
@Resource
private CategoryDao categoryDao;
@Override
public void save(Category category) {
categoryDao.save(category);
}
@Override
public void saveCategory(File file, CategoryService categoryService) {
try {
FileInputStream inputStream=new FileInputStream(file);
EasyExcel.read(inputStream, CategoryExcel.class,new CategoryListener(categoryService)).sheet().doRead();
}catch (Exception e){
e.printStackTrace();
}
}
@Override
public Category getOne(String name, Integer pid) {
return categoryDao.getOne(name,pid);
}
CategoryListener监听器
public class CategoryListener extends AnalysisEventListener<CategoryExcel> {
//创建对象
public CategoryService categoryService;
public CategoryListener(){};
public CategoryListener(CategoryService categoryService){
this.categoryService=categoryService;
};
@Override
public void invoke(CategoryExcel categoryExcel, AnalysisContext analysisContext) {
if(categoryExcel == null) {
System.out.println("数据为空");
}
//一行一行读取,每次读取有两个值,第一个值一级分类,第二个值二级分类
//判断一级分类是否重复
Category category=existOne(categoryService,categoryExcel.getOneCategory());
if(category==null){
category=new Category(null,categoryExcel.getOneCategory(),0);
categoryService.save(category);
}
//获取一级分类id值
Integer pid = category.getId();
//添加二级分类
//判断二级分类是否重复
Category existTwoSubject = existTwo(categoryService, categoryExcel.getTwoCategory(), pid);
if(existTwoSubject == null) {
category=new Category(null,categoryExcel.getTwoCategory(),pid);
categoryService.save(category);
}
}
//判断一级分类不能重复添加
//这里根据条件找到一级分类
private Category existOne(CategoryService categoryService , String name) {
Category category = categoryService.getOne(name,0);
return category;
}
//判断二级分类不能重复添加
//这里根据条件找到二级分类
private Category existTwo(CategoryService categoryService,String name,Integer pid) {
Category category = categoryService.getOne(name,pid);
return category;
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
}
运行结果