• 阿里 EasyExcel 使用及避坑


    github地址:https://github.com/alibaba/easyexcel

    原本在项目中使用EasyPoi读取excel,后来为了统一技术方案,改用阿里的EasyExcel。EasyExcel和EasyPoi有一定的相似之处。

    EasyExcel和EasyPoi效率对比:

    因为数据量少,从效率上看几乎没有差别,EasyExcel略胜一筹。

    使用maven的方式引用EasyExcel

    https://mvnrepository.com/artifact/com.alibaba/easyexcel

            <!--easyexcel-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>easyexcel</artifactId>
                <version>1.1.2-beat1</version>
            </dependency>

    使用Java模型的方式使用easyexcel

    Java模型

    @Data
    public class TotalAmount extends BaseRowModel implements Serializable {
        
        private Integer id;
    
        @ExcelProperty(value ="类型",index = 0)
        private String type;//开支类型 信用卡等
    
        @ExcelProperty(value = "金额",index =1)
        private String sum;
    
        @ExcelProperty(value = "来源",index =2)
        private String name;//开支来源  如:**银行信用卡
    
        @ExcelProperty(value = "日期",index =3)
        private String date;
    
        @ExcelProperty(value = "状态",index =4)
        private Integer status;
    
        @ExcelProperty(value = "备注",index =5)
        private String descr;
    
    
    }

    使用Java模型的方式需要继承 BaseRowModel ,字段上使用 @ExcelProperty 注解,注解中 value 属性指定字段名,index属性指定字段排序。

    注意:这里和EasyExcel不同的是,目前可以使用只指定index和同时指定index和value的方式来匹配excel文件,但是如果只指定value,则无法读取。

        @RequestMapping("/importExce")
        @ResponseBody
        public JsonResponse importExcel(@RequestParam("excelFile") MultipartFile excelFile, String type) throws IOException {
            JsonResponse jsonResponse = new JsonResponse();
            String sm="2019-02";
            List<Object> dataList = null;
            dataList = EasyExcelFactory.read(excelFile.getInputStream(), new Sheet(3, 1, TotalAmount.class));
            int scuess = 0;
            int error = 0;
            for (Object o : dataList) {
                if (o instanceof TotalAmount) {
                    TotalAmount importEntity = (TotalAmount) o;
    
                    try {
    
                    } catch (Exception e) {
                        error++;
                        e.printStackTrace();
                        continue;
                    }
                }
            }
        }
    
    /*    @RequestMapping("/importExce")
        @ResponseBody
        public JsonResponse importExce(){
            JsonResponse jsonResponse = new JsonResponse();
            File excelFile = new File
                    ("E:\工作文档\部门架构201902(bug).xlsx");
            String sm="2019-02";
            InputStream inputStream = new FileInputStream(excelFile);
            List<Object> dataList = null;
            dataList = EasyExcelFactory.read(inputStream, new Sheet(3, 1, TotalAmount.class));
            int scuess = 0;
            int error = 0;
            for (Object o : dataList) {
                if (o instanceof TotalAmount) {
                    TotalAmount importEntity = (TotalAmount) o;
    
                    try {
    
                    } catch (Exception e) {
                        error++;
                        e.printStackTrace();
                        continue;
                    }
                }
            }
        }*/

    注意:在使用EasyExcel时容易出的几个错误:

    For input "" 类型错误,应该是double等类型的字段有非double类型的数据

    java.lang.NumberFormatException: multiple points 多线程使用非线程安全类报错,实际是在日期格式里有并非指定日期格式的数据,比如空格,比如指定 yyyy/mm/dd 但数据是 yyyy-mm-dd

    使用easyexcel写出excel:

    使用Java模型方式,返回模型列表,带入方法即可

        /**
         * 导出Excel
         *
         * @param request
         * @param response
         * @param map
         * @throws IOException
         */
        @RequestMapping("export.do")
        public void export(HttpServletRequest request, String type, HttpServletResponse response,
                           @RequestParam Map<String, Object> map) throws IOException {
            ServletOutputStream out = null;
            try {
                out = response.getOutputStream();
            } catch (IOException e) {
                e.printStackTrace();
            }
            ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX, true);
            String filename;
            String fileName = null;
            try {
                filename = new Date().toLocaleString();
                fileName = new String((filename).getBytes(), "UTF-8");
                Sheet sheet2 = new Sheet(2, 3, ImportEntityEasyExcel.class, "sheet", null);
                List<ImportEntityEasyExcel> list = service.getData(map);
                response.setCharacterEncoding("utf-8");
                response.setContentType("application/vnd.ms-excel");
                response.setHeader("content-Disposition",
                        "attachment;filename=" + URLEncoder.encode(fileName + ".xlsx", "utf-8"));
                out.flush();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                writer.finish();
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    总结:

    easyexcel还有一些并不完善,但是大数据量操作效率高于easypoi

  • 相关阅读:
    processon--工作中画业务流程图很好的网站,欢迎推荐
    项目中关于RPC 和rocketMQ使用场景的感受
    如何永久激活(破解) IntelliJ IDEA 2018.2
    js生成二维码
    序列化反序列化
    bootstrap-treeview分级展示列表树的实现
    关于redis分布式锁实现原理
    LocalDate
    html css javascript mysql php学习总结
    JQuery中$.ajax()方法参数详解
  • 原文地址:https://www.cnblogs.com/jiangwz/p/10564749.html
Copyright © 2020-2023  润新知