概述
第一次使用easyExcel,记一次SpringBoot实现的demo。一个文件多个sheet页操作。多sheet多实体(不同的实体导出到不同的sheet,不同的sheet导入到不同的表)
写在前面:demo里有些重复的代码,如果有大佬看到并能帮忙改进,感激不尽。希望能帮到需要的人。上代码顺序:工具类--实体--mapper-service--controller--演示结果
easyExcel官方地址: Alibaba Easy Excel - 简单、省内存的Java解析Excel工具 | 首页
先上导入
工具类
package com.example.easyexcel.utils;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName:
* @author: jiangze
* @create: 2021-11-22 16:07
* @description:
*/
@Slf4j
@Data
public class DemoDataListener<E> extends AnalysisEventListener<E> {
private static final Logger LOGGER = LoggerFactory.getLogger(DemoDataListener.class);
private List<E> list = new ArrayList<E>();
@Override
public void invoke(E data, AnalysisContext context) {
LOGGER.info("解析到一条数据:{}", JSON.toJSONString(data));
list.add(data);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
LOGGER.info("当前sheet数据解析完成!");
}
}
实体类
导入的实体类就是普通的实体类,
mapper
service
@Override
@Transactional
public boolean inputEmpeInfo(MultipartFile file) throws IOException {
boolean b = false;
ExcelReader excelReader = EasyExcel.read(file.getInputStream()).build();
/* 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,
然后里面用到spring可以构造方法传进去*/
DemoDataListener<EmpeInfo> listener = new DemoDataListener<>();
/*
* readsheet:从第几个sheet开始读
* head:实体类.class
* registerReadListener:新建的listenter
* headRowNumber:从第几行开始读
* */
ReadSheet readSheet1 =
EasyExcel.readSheet(0).head(EmpeInfo.class).registerReadListener(listener).headRowNumber(1).build();
excelReader.read(readSheet1);
List<EmpeInfo> empeInfos = listener.getList();//读取到的数据集合
for (int j = 0; j < empeInfos.size(); j++) {
b = easyExcelMapper.addEmpeINfo(empeInfos.get(j));//添加数据到库里
}
DemoDataListener<EdauInfo> listener1 = new DemoDataListener<>();
ReadSheet readSheet2 =
EasyExcel.readSheet(1).head(EdauInfo.class).registerReadListener(listener1).headRowNumber(1).build();
excelReader.read(readSheet2);
List<EdauInfo> edauInfos = listener1.getList();
for (int j = 0; j < edauInfos.size(); j++) {
b = easyExcelMapper.addEdauInfo(edauInfos.get(j));
}
DemoDataListener<WorkInfo> listener2 = new DemoDataListener<>();
ReadSheet readSheet3 =
EasyExcel.readSheet(2).head(WorkInfo.class).registerReadListener(listener2).headRowNumber(1).build();
excelReader.read(readSheet3);
List<WorkInfo> workInfos = listener2.getList();
for (int j = 0; j < workInfos.size(); j++) {
b = easyExcelMapper.addWorkInfo(workInfos.get(j));
}
// 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
excelReader.finish();
return b;
}
Controller
@RequestMapping(value = "/inputEmpeInfo")
@ResponseBody
public String inputEmpeInfo(MultipartFile file) throws IOException {
easyExcelService.inputEmpeInfo(file);
return "true";
}
演示结果
postman测试:
文档格式
导入结果
接着上导出
导出没有用到工具类
实体类
mapper
service
public void WriteEmpeInfo(HttpServletResponse response) throws IOException {
String fileName = "EmpeInfo" + System.currentTimeMillis();
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();//创建文件
/*创建sheet页
* writerSheet:第几个sheet页,sheet页名
* head:继承了BaseRowModel的实体类 .class
* */
WriteSheet empeInfo = EasyExcel.writerSheet(0, "empeInfo").head(EmpeInfoExcel.class).build();
List<EmpeInfoExcel> empe = easyExcelMapper.selectEmpe();//查询数据库数据
excelWriter.write(empe, empeInfo);//把查到的数据写进sheet页
WriteSheet edauInfo = EasyExcel.writerSheet(1, "edauInfo").head(EdauInfoExcel.class).build();
List<EdauInfoExcel> edau = easyExcelMapper.selectEdau();
excelWriter.write(edau, edauInfo);
WriteSheet workInfo = EasyExcel.writerSheet(2, "workInfo").head(WorkInfoExcel.class).build();
List<WorkInfoExcel> work = easyExcelMapper.selectWork();
excelWriter.write(work, workInfo);
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
// 千万别忘记finish 会帮忙关闭流
excelWriter.finish();
}
controller
演示结果
postman演示:因为我查询全部,所以没有传参,有需要可以自己传参
接着是浏览器直接访问的方式
总结
easyExcel确实很好用啊,但是我自己能力有限,结果就是有成功,有失败,瑕疵不分请各位不吝赐教!!拜托啦
最后
以上就是体贴小甜瓜为你收集整理的java:EasyExcel实现多sheet页导入导出的全部内容,希望文章能够帮你解决java:EasyExcel实现多sheet页导入导出所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复