Springboot使用EasyExcel(仅限自己收藏)

  1. pom文件依赖
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>easyexcel</artifactId>
        <version>1.1.2-beta5</version>
    </dependency>
    

      

  2. ExporExcelController 文件中
    @RequestMapping("/exce")
    @Controller
    public class ExporExcelController {
        //植入Service
        @Resource(name = "idemoService")
        private DemoService demoService;
    
        /*
         *直接输出数据到前台
         */
        @RequestMapping("/export")
        public String ExporExcel(HttpServletResponse response) throws Exception { //throws IOException {
            ExcelWriter writer = null;
            OutputStream outputStream = response.getOutputStream();
            try {
                //添加响应头信息
                response.setHeader("Content-disposition", "attachment; filename=" + "catagory.xls");
                response.setContentType("application/msexcel;charset=UTF-8");//设置类型
                response.setHeader("Pragma", "No-cache");//设置头
                response.setHeader("Cache-Control", "no-cache");//设置头
                response.setDateHeader("Expires", 0);//设置日期头
    
                //实例化 ExcelWriter
                writer = new ExcelWriter(outputStream, ExcelTypeEnum.XLS, true);
    
                //实例化表单
                Sheet sheet = new Sheet(1, 0, Catagory.class);
                sheet.setSheetName("测试");
                //获取数据
                List<Catagory> catagoryList = demoService.findAllToExcel();
                //System.out.println(catagoryList.size());
                //输出
                writer.write(catagoryList, sheet);
                writer.finish();
                outputStream.flush();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    response.getOutputStream().close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return null;
        }
    
        /*
         *
         */
        @RequestMapping("/import")
        @ResponseBody
        public void importExcel(@RequestParam("file") MultipartFile file) throws IOException {
           
                InputStream inputStream = file.getInputStream();
                //实例化实现了AnalysisEventListener接口的类
                ExcelListener listener = new ExcelListener();
                //传入参数
                ExcelReader excelReader = new ExcelReader(inputStream, ExcelTypeEnum.XLS, null, listener);
                //读取信息
                excelReader.read(new Sheet(1, 1, Catagory.class));
                //获取数据
                List<Object> list = listener.getDatas();
                List<Catagory> catagoryList = new ArrayList<Catagory>();
                Catagory catagory = new Catagory();
    
                //转换数据类型,并插入到数据库
                for (int i = 0; i < list.size(); i++) {
                    catagory = (Catagory) list.get(i);
                      System.out.println(catagory);
                    demoService.addForExcel(catagory);
                }
            
    
        }
    /*
    *在服务器上生成excel
     */
        @RequestMapping("/exportserver")
        @ResponseBody
        public String writeBySimple() {
            /*
            System.out.println(System.getProperty("user.dir"));
            String path =System.getProperty("user.dir")+"\\Index"; //所创建文件目录
            */
            String path = System.getProperty("user.dir")+"\\target\\classes\\static";
            String filePath = "tmpexcel";
            File f = new File(path+"\\"+filePath);
            if(!f.exists()) {
                f.mkdirs(); //创建目录
            }
    
    
            String fileName = "测试.xlsx";
            List<List<Object>> data = new ArrayList<>();
            data.add(Arrays.asList("111", "222", "333"));
            data.add(Arrays.asList("111", "222", "333"));
            data.add(Arrays.asList("111", "222", "333"));
            List<String> head = Arrays.asList("表头1", "表头2", "表头3");
            ExcelUtil.writeBySimple(path+"\\"+filePath+"\\"+fileName, data, head);
            return filePath+"\\"+fileName;
            //return null;
        }
    }
    

     

  3.  DeamDao中

    @Component("DemoEmDAO")
    public interface DemoDAO {
        //excel查询所有
        @Select("select id,name,sex,age from em")
        public List<Catagory> findAllToExcel() throws Exception;
        //添加
        public int addForExcel(Catagory model);
    }
    

      

  4. Model中
    @EqualsAndHashCode(callSuper = true)
    @Data
    public class Catagory extends BaseRowModel {
        @ExcelProperty(value = "id", index = 0)
        private Integer id;
    
        @ExcelProperty(value = "姓名", index = 1)
        private String name;
    
        @ExcelProperty(value = "性别", index = 2)
        private String sex;
    
        @ExcelProperty(value = "年龄", index = 3)
        private Integer age;
    
    }
    

      

  5. DemoService中
    public interface DemoService {
    
        //excel查询所有
        public List<Catagory> findAllToExcel() throws Exception;
        //添加
        public int addForExcel(Catagory model);
    }
    

      

  6. DemoServiceImpl中
    @Service("idemoService")
    public class DemoServiceImpl implements DemoService {
        @Resource(name = "DemoEmDAO")
        private DemoDAO dao;
        @Override
        public List<Catagory> findAllToExcel() throws Exception {
           return dao.findAllToExcel();
        }
    
        @Override
        public int addForExcel(Catagory model) {
            dao.addForExcel(model);
            return 0;
        }
    }
    

      

  7. ExcelListener中
    public class ExcelListener extends AnalysisEventListener {
        //可以通过实例获取该值
        private List<Object> datas = new ArrayList<Object>();
    
        public void invoke(Object o, AnalysisContext analysisContext) {
            datas.add(o);//数据存储到list,供批量处理,或后续自己业务逻辑处理。
            doSomething(o);//根据自己业务做处理
        }
    
        private void doSomething(Object object) {
            //1、入库调用接口
        }
    
        public List<Object> getDatas() {
            return datas;
        }
        public void setDatas(List<Object> datas) {
            this.datas = datas;
        }
    
        public void doAfterAllAnalysed(AnalysisContext analysisContext) {
            // datas.clear();//解析结束销毁不用的资源
        }
    }
    

      

  8. ExcleUtil中
    @Slf4j
    public class ExcelUtil {
      //  private static Logger logger = LoggerFactory.getLogger(ExcelUtil.class);
        private static Sheet initSheet;
    
        static {
            initSheet = new Sheet(1, 0);
            initSheet.setSheetName("sheet");
            //设置自适应宽度
            initSheet.setAutoWidth(Boolean.TRUE);
        }
    
        /**
         * 读取少于1000行数据
         * @param filePath 文件绝对路径
         * @return
         */
        public static List<Object> readLessThan1000Row(String filePath){
            return readLessThan1000RowBySheet(filePath,null);
        }
    
        /**
         * 读小于1000行数据, 带样式
         * filePath 文件绝对路径
         * initSheet :
         *      sheetNo: sheet页码,默认为1
         *      headLineMun: 从第几行开始读取数据,默认为0, 表示从第一行开始读取
         *      clazz: 返回数据List<Object> 中Object的类名
         */
        public static List<Object> readLessThan1000RowBySheet(String filePath, Sheet sheet){
            if(!StringUtils.hasText(filePath)){
                return null;
            }
            Logger log = LoggerFactory.getLogger(ExcelUtil.class);
            sheet = sheet != null ? sheet : initSheet;
    
            InputStream fileStream = null;
            try {
                fileStream = new FileInputStream(filePath);
                return EasyExcelFactory.read(fileStream, sheet);
            } catch (FileNotFoundException e) {
                log.info("找不到文件或文件路径错误, 文件:{}", filePath);
            }finally {
                try {
                    if(fileStream != null){
                        fileStream.close();
                    }
                } catch (IOException e) {
                    log.info("excel文件读取失败, 失败原因:{}", e);
    
                }
            }
            return null;
        }
    
        /**
         * 读大于1000行数据
         * @param filePath 文件觉得路径
         * @return
         */
        public static List<Object> readMoreThan1000Row(String filePath){
            return readMoreThan1000RowBySheet(filePath,null);
        }
    
        /**
         * 读大于1000行数据, 带样式
         * @param filePath 文件觉得路径
         * @return
         */
        public static List<Object> readMoreThan1000RowBySheet(String filePath, Sheet sheet){
            if(!StringUtils.hasText(filePath)){
                return null;
            }
            Logger log = LoggerFactory.getLogger(ExcelUtil.class);
            sheet = sheet != null ? sheet : initSheet;
    
            InputStream fileStream = null;
            try {
                fileStream = new FileInputStream(filePath);
                ExcelListener excelListener = new ExcelListener();
                EasyExcelFactory.readBySax(fileStream, sheet, excelListener);
                return excelListener.getDatas();
            } catch (FileNotFoundException e) {
                log.error("找不到文件或文件路径错误, 文件:{}", filePath);
            }finally {
                try {
                    if(fileStream != null){
                        fileStream.close();
                    }
                } catch (IOException e) {
                    log.error("excel文件读取失败, 失败原因:{}", e);
                }
            }
            return null;
        }
    
        /**
         * 生成excle
         * @param filePath  绝对路径, 如:/home/chenmingjian/Downloads/aaa.xlsx
         * @param data 数据源
         * @param head 表头
         */
        public static void writeBySimple(String filePath, List<List<Object>> data, List<String> head){
            writeSimpleBySheet(filePath,data,head,null);
        }
    
        /**
         * 生成excle
         * @param filePath 绝对路径, 如:/home/chenmingjian/Downloads/aaa.xlsx
         * @param data 数据源
         * @param sheet excle页面样式
         * @param head 表头
         */
        public static void writeSimpleBySheet(String filePath, List<List<Object>> data, List<String> head, Sheet sheet){
            sheet = (sheet != null) ? sheet : initSheet;
    
            if(head != null){
                List<List<String>> list = new ArrayList<>();
                head.forEach(h -> list.add(Collections.singletonList(h)));
                sheet.setHead(list);
            }
    
            OutputStream outputStream = null;
            ExcelWriter writer = null;
            try {
                outputStream = new FileOutputStream(filePath);
                writer = EasyExcelFactory.getWriter(outputStream);
                writer.write1(data,sheet);
            } catch (FileNotFoundException e) {
               // log.error("找不到文件或文件路径错误, 文件:{}", filePath);
                System.out.println("找不到文件或文件路径错误, 文件:{}"+ filePath);
            }finally {
                try {
                    if(writer != null){
                        writer.finish();
                    }
    
                    if(outputStream != null){
                        outputStream.close();
                    }
    
                } catch (IOException e) {
                  //  log.error("excel文件导出失败, 失败原因:{}", e);
                    System.out.println("excel文件导出失败, 失败原因:{}");
                }
            }
    
        }
    
        /**
         * 生成excle
         * @param filePath 绝对路径, 如:/home/chenmingjian/Downloads/aaa.xlsx
         * @param data 数据源
         */
        public static void writeWithTemplate(String filePath, List<? extends BaseRowModel> data){
            writeWithTemplateAndSheet(filePath,data,null);
        }
    
        /**
         * 生成excle
         * @param filePath 绝对路径, 如:/home/chenmingjian/Downloads/aaa.xlsx
         * @param data 数据源
         * @param sheet excle页面样式
         */
        public static void writeWithTemplateAndSheet(String filePath, List<? extends BaseRowModel> data, Sheet sheet){
            if(CollectionUtils.isEmpty(data)){
                return;
            }
    
            sheet = (sheet != null) ? sheet : initSheet;
            sheet.setClazz(data.get(0).getClass());
    
            OutputStream outputStream = null;
            ExcelWriter writer = null;
            try {
                outputStream = new FileOutputStream(filePath);
                writer = EasyExcelFactory.getWriter(outputStream);
                writer.write(data,sheet);
            } catch (FileNotFoundException e) {
              //  log.error("找不到文件或文件路径错误, 文件:{}", filePath);
                System.out.println("找不到文件或文件路径错误, 文件:{}"+ filePath);
            }finally {
                try {
                    if(writer != null){
                        writer.finish();
                    }
    
                    if(outputStream != null){
                        outputStream.close();
                    }
                } catch (IOException e) {
                  //  log.error("excel文件导出失败, 失败原因:{}", e);
                    System.out.println("excel文件导出失败, 失败原因:{}");
                }
            }
    
        }
    
        /**
         * 生成多Sheet的excle
         * @param filePath 绝对路径, 如:/home/chenmingjian/Downloads/aaa.xlsx
         * @param multipleSheelPropetys
         */
        public static void writeWithMultipleSheel(String filePath,List<MultipleSheelPropety> multipleSheelPropetys){
            if(CollectionUtils.isEmpty(multipleSheelPropetys)){
                return;
            }
    
            OutputStream outputStream = null;
            ExcelWriter writer = null;
            try {
                outputStream = new FileOutputStream(filePath);
                writer = EasyExcelFactory.getWriter(outputStream);
                for (MultipleSheelPropety multipleSheelPropety : multipleSheelPropetys) {
                    Sheet sheet = multipleSheelPropety.getSheet() != null ? multipleSheelPropety.getSheet() : initSheet;
                    if(!CollectionUtils.isEmpty(multipleSheelPropety.getData())){
                        sheet.setClazz(multipleSheelPropety.getData().get(0).getClass());
                    }
                    writer.write(multipleSheelPropety.getData(), sheet);
                }
    
            } catch (FileNotFoundException e) {
               // log.error("找不到文件或文件路径错误, 文件:{}", filePath);
                System.out.println("找不到文件或文件路径错误, 文件:{}"+ filePath);
            }finally {
                try {
                    if(writer != null){
                        writer.finish();
                    }
    
                    if(outputStream != null){
                        outputStream.close();
                    }
                } catch (IOException e) {
                   // log.error("excel文件导出失败, 失败原因:{}", e);
                    System.out.println("excel文件导出失败, 失败原因:{}");
                }
            }
    
        }
    
    }
    

      

  9. JsonDateSerializer中
    public class JsonDateSerializer extends JsonSerializer<Date> {
        private SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        @Override
        public void serialize(Date date, JsonGenerator gen, SerializerProvider provider)
                throws IOException, JsonProcessingException {
            String value = dateFormat.format(date);
            gen.writeString(value);
        }
    }
    

      

  10. MultipleSheelPropety中
    @Data
    public  class MultipleSheelPropety {
    
        private List<? extends BaseRowModel> data;
      //可以通过实例获取该值
       // private List<Object> data = new ArrayList<Object>();
        private Sheet sheet;
    
        public List<? extends BaseRowModel> getData() {
            return data;
        }
        public void setDatas(List<? extends BaseRowModel> data) {
            this.data = data;
        }
    
        public Sheet getSheet() {
            return sheet;
        }
    
        public void setSheet(Sheet sheet) {
            this.sheet = sheet;
        }
    }
    

      

  11. DemoMapper.xml中
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    <mapper namespace="com.exceldemo.demo.mapper.DemoDAO" >
        <resultMap id="BaseResultMap" type="com.exceldemo.demo.entity.Em" >
            <id column="id" property="id" jdbcType="INTEGER" />
            <result column="name" property="name" jdbcType="VARCHAR" />
            <result column="sex" property="sex" jdbcType="TIMESTAMP" />
            <result column="age" property="age" jdbcType="INTEGER" />
            <result column="createDate" property="createDate" jdbcType="TIMESTAMP" />
        </resultMap>
        <!--01.查询所有记录-->
        <select id="findAll" resultType="com.exceldemo.demo.entity.Em">
             select * from em
         </select>
        <!--excel导入-->
        <insert id="addForExcel">
            insert into em(name,sex,age,createDate) values(#{name},#{sex},#{age},now())
        </insert>
    </mapper>
    

      

  12. html文件
    <!DOCTYPE html>
    <html lang="zh-CN" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="utf-8" />
        <title>excel导入导出</title>
        <script type="text/javascript" th:src="@{/js/jquery-3.4.1.min.js}"></script>
    
    </head>
    <body>
    <!--表单提交-->
    <form action="/exce/import" method="post" enctype="multipart/form-data">
        <input type="file" name="file" id="file"/>
        <input type="submit" value="表单提交">
    
    </form>
    <!--通过js提交-->
    <input type="file" name="file" id="file2"/>
    <input name="btnSubmit" type="button" value="JS导入" onclick="fnImpotExcel()"/>
    <br>
    <input name="btnSubmit" type="button" value="导出excel1(直接输出excel数据)" onclick="window.open('/exce/export')"/>
    <input name="btnSubmit" type="button" value="导出excel2(服务器上生成excel文件,返回文件地址)" onclick="fnExportExcel('/exce/exportserver')"/>
    </body>
    </html>
    <script>
        function fnImpotExcel(){
            var blob = document.getElementById('file2').files[0];
    
            var xhr = new XMLHttpRequest();
    
            xhr.onreadystatechange = function() {
                if(xhr.readyState == 4) {
                    if(xhr.responseText) {
                        alert(xhr.responseText);
                        // if(slices == 0) {
                        //  alert(2)
                        // }
                    }
    
                }
            };
    
    //构造form数据
            var fd = new FormData();
            fd.append("file", blob);
            fd.append("name", blob.name);
            xhr.open("POST", "/exce/import", false);
    
            //设置二进制文边界件头
            //xhr.setRequestHeader("X_Requested_With", location.href.split("/")[3].replace(/[^a-z]+/g, '$'));
            xhr.send(fd);
            /*
                $.ajax({
                    url: "/exce/import",
                    type: "post",
                    data: {field:document.getElementById('file2').files[0]},
                    success: function (data) {alert(data);
                        console.log(data);
                      //  data = decodeURIComponent(decodeURIComponent (data)).split(",");
                       // $.each(a,function (k,v) {
                         //   $("[data-id="+a[k]+"]").append(decodeURIComponent(decodeURIComponent (data[k])));
                       // })
                    }
                })
    
             */
        }
        //导出excel
        function fnExportExcel(url){
            $.ajax({
                url: url,
                type: "post",
                success: function (data) {
                    if(data!="") window.open("/"+data);
                }
            })
        }
    </script>
    

      

  13. SQL文件
    DROP TABLE IF EXISTS `em`;
    CREATE TABLE `em` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) DEFAULT NULL,
      `sex` varchar(10) DEFAULT NULL,
      `age` int(11) DEFAULT NULL,
      `createDate` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of em
    -- ----------------------------
    INSERT INTO `em` VALUES ('3', '张西', '女', '63', '2019-11-07 23:02:28');
    INSERT INTO `em` VALUES ('4', '兰六', '男', '7', '2019-11-07 23:02:28');
    INSERT INTO `em` VALUES ('5', '兰六11', '男', '11', '2019-11-07 23:05:28');
    

      

posted @ 2020-03-11 15:28  一生无过  阅读(2636)  评论(0编辑  收藏  举报