这里 介绍一下单模板和N个模板都可以用的
首先咱们先来看一下单模板的
一. 导入 pom依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.0.2</version>
</dependency>
二.创建一个类(随便一个类)并让这个类继承 AnalysisEventListener<实体类> 并实现里面的方法(具体看下方代码)
public class ExcelListener extends AnalysisEventListener<ExcelModel> {
// ExcelModel :实体类
//自定义用于暂时存储data。
//可以通过实例获取该值
private List<ExcelModel> datas = new ArrayList<>();
//private List<Map<String,Object>> datas = new ArrayList<>(); //根据需求也可选择用map来接收
// @Override
// public void invoke(Map<String,Object> map, AnalysisContext analysisContext) {
//
// datas.add(map);//数据存储到list,供批量处理,或后续自己业务逻辑处理。
//
// }
@Override
public void invoke(ExcelModel excelModel, AnalysisContext analysisContext) {//此方法一行一行的读取Excel内容
if (excelModel.getUsername() != null) { //做一个简单的判断,可根据自己的业务逻辑更改
datas.add(excelModel);//数据存储到list,供批量处理,或后续自己业务逻辑处理。
}
}
public void doAfterAllAnalysed(AnalysisContext context) {
// datas.clear();//解析结束销毁不用的资源,也可待数据入库后在进行销毁,根据具体业务需求自行更改
}
public List<ExcelModel> getDatas() { //把存储的数据通过此方法暴露出去
return datas;
}
}
三. 创建所用到的实体类(Excel模板)
@Scope("prototype")
@Data //此注释需要导入lombok
@ContentRowHeight(25) //数据表格列高
@HeadRowHeight(20) //标题表格列高
@ColumnWidth(25) //标题表格列宽
public class ExcelModel {
// private String id;
@ExcelProperty(value = "姓名",index = 0) //index表示读取的数据在第几列,根据业务需求自行对应
private String username;
@ExcelProperty(value = "年龄",index = 1)
private String userage;
@ExcelProperty(value = "邮箱",index = 2)
private String useremail;
}
四.接下来就是调用刚才写完的东西
@RequestMapping("uploadExcel")
@ResponseBody
public void uploadExcel(MultipartFile excelFile) throws IOException {
ExcelListener listener = new ExcelListener(); //ExcelListener 上面创建的那个类
EasyExcel.read(excelFile.getInputStream(), ExcelModel.class,listener).sheet(0).doReadSync(); //ExcelModel 上面创建的实体类
System.out.println("解析完之后的数据:---"+listener.getDatas());
List<ExcelModel> datas = listener.getDatas(); //把拿到的数据处理到集合里去(根据所需自行修改)
baseService.insertExcelService(datas);//入库
datas.clear();//结束后销毁不用的资源
System.out.println(datas); //查看销毁后的结果
}
上面单模板的实现到此结束,下面咱们来看多个模板的操作
直接改一下ExcelListener这个类
// 具体代码
public class ExcelListener extends AnalysisEventListener { //在这里不给它指定具体模板(实体类)
private List<Map<String,Object>> datas = new ArrayList<>();
@Override
public void invoke(Object obj, AnalysisContext analysisContext) {
Map<String,Object> map =new HashMap<>();
map.put("maps",obj);
datas.add(map);
System.out.println("读取的很一行的数据:---"+obj);
}
public void doAfterAllAnalysed(AnalysisContext context) {
// datas.clear();//解析结束销毁不用的资源
}
}
Controller中的改动
public int getExcelData(MultipartFile excelFile, String type) throws IOException {
ExcelListener listener = new ExcelListener();
int i =0;
if ("agricul".equals(type)){ //根据传过来的type来判断用哪个模板(实体类)
List<Object> objects = EasyExcel.read(excelFile.getInputStream(), ExcelModel.class, listener).sheet(0).doReadSync();
for (Object ii:objects) {
ExcelModel mod= (ExcelModel) ii; //把拿过来的Object转换成具体实体类
if(mod.getCityid()==null || mod.getCounttotal()==null || mod.getNtptwoid()==null ||mod.getCityid()==0){ //做一些简单的判断
continue;
}
// System.out.println(mod);
i = mpntpMapper.insert(mod); //入库
}
return i;
}
}
最后就是下载了没什么好说的具体看代码吧
@RequestMapping("/downloadExcel")
public void downloadExcel(HttpServletResponse response) throws Exception {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
List<ExcelModel> list = baseService.selectExcelService(); //数据库中获取的数据
String fileName = URLEncoder.encode(UUID.randomUUID().toString().replaceAll("-",""), "UTF-8");
response.setHeader("Content-disposition", "attachment;filename="+fileName+".xlsx");
EasyExcel.write(response.getOutputStream(),ExcelModel.class).sheet("sheet1").doWrite(list);
}
其实具体的变化主要就是在ExcelListener类中进行更改逻辑条件,有什么问题小伙伴们可以留言,大家一起学习,祝大家好运!
官方文档:https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write
自定义单元格样式:https://blog.csdn.net/weixin_47691902/article/details/115198670?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-115198670-blog-126995032.pc_relevant_3mothn_strategy_recovery&spm=1001.2101.3001.4242.2&utm_relevant_index=4