zoukankan      html  css  js  c++  java
  • EasyExcel导入工具(SpringMVC下使用)

    easyExcel:由阿里巴巴公司开发,由github托管

    github上有详细使用文档

    github地址:https://github.com/alibaba/easyexcel/blob/master/quickstart.md

    导入

    1、模型类:可以是实体类

    主要是@ExcelProperty注解

    value:对应字段

    index:对应导入模板是第几列(从0开始)

    @ExcelProperty(value = "name", index = 0)

    推荐使用有模型,因为导入模板如果有变化,index可以随时改变

    2、Controller接收导入文件

    //批量导入(有模型)
        @RequestMapping("batchImport")
        public ModelAndView batchImport(@RequestParam(value = "file", required=true)MultipartFile file) {
            ModelAndView mv=new ModelAndView();
            mv.setView(Jackson2Util.jsonView());
            InputStream in = null;
            try {
                in = file.getInputStream();
                // 解析每行结果在listener中处理
                AnalysisEventListener listener = new ExcelListener(vehicleInfoService);
                ExcelReader excelReader = new ExcelReader(in, ExcelTypeEnum.XLSX, null, listener);
                //(第几个sheet,表头所在行数,表格对应实体类)
                excelReader.read(new Sheet(1, 1, ExcelCardIssueVehicleInfo.class));
                
                mv.addObject("res", "0");
                
            } catch(Exception e) {
                logger.error("批量导入失败!", e);
            } finally {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return mv;
        }

    3、解析每行数据并入库

    public class ExcelListener extends AnalysisEventListener {
        private CardIssueVehicleInfoService cardIssueVehicleInfoService;
       
        public ExcelListener(CardIssueVehicleInfoService cardIssueVehicleInfoService) {
            super();
            this.cardIssueVehicleInfoService = cardIssueVehicleInfoService;
        }
        
        private List<CardIssueVehicleInfo> datas = new ArrayList<CardIssueVehicleInfo>();
        //每解析一行数据就走一遍invoke()方法
        public void invoke(Object object, AnalysisContext context) {
            //转为导入模型类
            ExcelCardIssueVehicleInfo excel = (ExcelCardIssueVehicleInfo)object;
            CardIssueVehicleInfo vehicleInfo =  new CardIssueVehicleInfo();
            try {
                //导入模型类转为对应数据库的实体类:可以是同一个实体类
                BeanUtils.copyProperties(vehicleInfo, excel);
                datas.add(vehicleInfo);    //数据存储到list,供批量导入处理,或后续自己业务逻辑处理。
                
            } catch (Exception e) {
                e.printStackTrace();
            } 
        }
        //解析完所有Excel数据后,走此方法
        public void doAfterAllAnalysed(AnalysisContext context) {
            try{
                //入库
                cardIssueVehicleInfoService.batchInsert(datas);
            } catch(Exception e) {
                logger.error("批量导入失败!", e);
            }
            datas.clear();//解析结束销毁不用的资源
        }
        
    
    }

    遇到问题及解决方案:

    1、模型(实体类)支持String和int类型,不支持Short类型

    2、在ExcelListener 类中,Spring注入Service层,会无法注入

    解决:在Controller层,将已注入的Service,传入ExcelListener中

     AnalysisEventListener listener = new ExcelListener(vehicleInfoService);

    并在ExcelListener的构造器中接收

    public ExcelListener(CardIssueVehicleInfoService cardIssueVehicleInfoService) {
            super();
            this.cardIssueVehicleInfoService = cardIssueVehicleInfoService;
    }

    3、poi.jar和poi-ooxml.jar的版本一定要一致(easyExcel依赖poi),不然会报错


    4、easyExcel基于POI的,遇到的报错,都可以按照POI的错误搜索解决办法

  • 相关阅读:
    CSS浮动(float、clear)通俗讲解
    JAVA 类的加载
    数据库操作 delete和truncate的区别
    正则表达式 匹配相同数字
    Oracle EBS OM 取消订单
    Oracle EBS OM 取消订单行
    Oracle EBS OM 已存在的OM订单增加物料
    Oracle EBS OM 创建订单
    Oracle EBS INV 创建物料搬运单头
    Oracle EBS INV 创建物料搬运单
  • 原文地址:https://www.cnblogs.com/Donnnnnn/p/10112682.html
Copyright © 2011-2022 走看看