阿里巴巴 EasyExcel (web版) 上传与下载(超详细) Excel上传下载

这里 介绍一下单模板和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
  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李猿猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值