• 阿里 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

  • 相关阅读:
    [BTS2004]一步一步学习BizTalk2004 Sql Server Adapter
    [JWT]安装配置AdobeWorkFlowServer
    [BizTalk][MSMQAdapter]如何使用MSMQ的优先级设置呢?
    [JWS]Adobe WorkFlow 学习笔记(二)
    [RS]消息订阅应用实例(一)
    [BizTalk][Pipeline]使用Pipeline(一)
    ActiveDirectoryLib
    [ASP.NET]10 Tips for Writing HighPerformance Web Applications
    [UML]始
    [学习笔记][C++Primer Plus]String类的使用
  • 原文地址:https://www.cnblogs.com/jiangwz/p/10564749.html
Copyright © 2020-2023  润新知