1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        史上最全的Excel導(dǎo)入導(dǎo)出(easyexcel版)

        共 35075字,需瀏覽 71分鐘

         ·

        2021-09-27 12:34

        來(lái)源:blog.csdn.net/qq_32258777/article/details/89031479

        喝水不忘挖井人,感謝阿里巴巴項(xiàng)目組提供了easyexcel工具類,github地址:

        https://github.com/alibaba/easyexcel

        文章目錄

        • 環(huán)境搭建
        • 讀取excel文件
          • 默認(rèn)讀取
          • 指定讀取
          • 默認(rèn)讀取
          • 指定讀取
          • 小于1000行數(shù)據(jù)
          • 大于1000行數(shù)據(jù)
        • 導(dǎo)出excle
          • 無(wú)模型映射導(dǎo)出
          • 模型映射導(dǎo)出
          • 單個(gè)Sheet導(dǎo)出
          • 多個(gè)Sheet導(dǎo)出
        • 工具類
        • 測(cè)試類

        環(huán)境搭建

        • easyexcel 依賴(必須)
        • springboot (不是必須)
        • lombok (不是必須)
         <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>easyexcel</artifactId>
           <version>1.1.2-beat1</version>
         </dependency>
          
         <dependency>
           <groupId>org.projectlombok</groupId>
           <artifactId>lombok</artifactId>
           <version>1.18.2</version>
         </dependency>

        讀取excel文件

        小于1000行數(shù)據(jù)

        默認(rèn)讀取

        讀取Sheet1的全部數(shù)據(jù)

         String filePath = "/home/chenmingjian/Downloads/學(xué)生表.xlsx";
         List<Object> objects = ExcelUtil.readLessThan1000Row(filePath);
        指定讀取

        下面是學(xué)生表.xlsx中Sheet1,Sheet2的數(shù)據(jù)

        獲取Sheet1表頭以下的信息

        String filePath = "/home/chenmingjian/Downloads/學(xué)生表.xlsx";
        //第一個(gè)1代表sheet1, 第二個(gè)1代表從第幾行開始讀取數(shù)據(jù),行號(hào)最小值為0
        Sheet sheet = new Sheet(11);
        List<Object> objects = ExcelUtil.readLessThan1000Row(filePath,sheet);

        獲取Sheet2的所有信息

         String filePath = "/home/chenmingjian/Downloads/學(xué)生表.xlsx";
         Sheet sheet = new Sheet(20);
         List<Object> objects = ExcelUtil.readLessThan1000Row(filePath,sheet);

        大于1000行數(shù)據(jù)

        默認(rèn)讀取
        String filePath = "/home/chenmingjian/Downloads/學(xué)生表.xlsx";
        List<Object> objects = ExcelUtil.readMoreThan1000Row(filePath);
        指定讀取
        String filePath = "/home/chenmingjian/Downloads/學(xué)生表.xlsx";
        Sheet sheet = new Sheet(12);
        List<Object> objects = ExcelUtil.readMoreThan1000Row(filePath,sheet);

        導(dǎo)出excle

        單個(gè)Sheet導(dǎo)出

        無(wú)模型映射導(dǎo)出
        String filePath = "/home/chenmingjian/Downloads/測(cè)試.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(filePath,data,head);

        結(jié)果

        模型映射導(dǎo)出

        1、定義好模型對(duì)象

        package com.springboot.utils.excel.test;

        import com.alibaba.excel.annotation.ExcelProperty;
        import com.alibaba.excel.metadata.BaseRowModel;
        import lombok.Data;
        import lombok.EqualsAndHashCode;

        /**
         * @description:
         * @author: chenmingjian
         * @date: 19-4-3 14:44
         */

        @EqualsAndHashCode(callSuper = true)
        @Data
        public class TableHeaderExcelProperty extends BaseRowModel {

            /**
             * value: 表頭名稱
             * index: 列的號(hào), 0表示第一列
             */

            @ExcelProperty(value = "姓名", index = 0)
            private String name;

            @ExcelProperty(value = "年齡",index = 1)
            private int age;

            @ExcelProperty(value = "學(xué)校",index = 2)
            private String school;
        }

        2、調(diào)用方法

        String filePath = "/home/chenmingjian/Downloads/測(cè)試.xlsx";
        ArrayList<TableHeaderExcelProperty> data = new ArrayList<>();
          for(int i = 0; i < 4; i++){
              TableHeaderExcelProperty tableHeaderExcelProperty = new TableHeaderExcelProperty();
              tableHeaderExcelProperty.setName("cmj" + i);
              tableHeaderExcelProperty.setAge(22 + i);
              tableHeaderExcelProperty.setSchool("清華大學(xué)" + i);
              data.add(tableHeaderExcelProperty);
          }

          ExcelUtil.writeWithTemplate(filePath,data);

        多個(gè)Sheet導(dǎo)出

        1、定義好模型對(duì)象

        package com.springboot.utils.excel.test;

        import com.alibaba.excel.annotation.ExcelProperty;
        import com.alibaba.excel.metadata.BaseRowModel;
        import lombok.Data;
        import lombok.EqualsAndHashCode;

        /**
         * @description:
         * @author: chenmingjian
         * @date: 19-4-3 14:44
         */

        @EqualsAndHashCode(callSuper = true)
        @Data
        public class TableHeaderExcelProperty extends BaseRowModel {

            /**
             * value: 表頭名稱
             * index: 列的號(hào), 0表示第一列
             */

            @ExcelProperty(value = "姓名", index = 0)
            private String name;

            @ExcelProperty(value = "年齡",index = 1)
            private int age;

            @ExcelProperty(value = "學(xué)校",index = 2)
            private String school;
        }

        2、調(diào)用方法

         ArrayList<ExcelUtil.MultipleSheelPropety> list1 = new ArrayList<>();
         for(int j = 1; j < 4; j++){
              ArrayList<TableHeaderExcelProperty> list = new ArrayList<>();
              for(int i = 0; i < 4; i++){
                  TableHeaderExcelProperty tableHeaderExcelProperty = new TableHeaderExcelProperty();
                  tableHeaderExcelProperty.setName("cmj" + i);
                  tableHeaderExcelProperty.setAge(22 + i);
                  tableHeaderExcelProperty.setSchool("清華大學(xué)" + i);
                  list.add(tableHeaderExcelProperty);
              }

              Sheet sheet = new Sheet(j, 0);
              sheet.setSheetName("sheet" + j);

              ExcelUtil.MultipleSheelPropety multipleSheelPropety = new ExcelUtil.MultipleSheelPropety();
              multipleSheelPropety.setData(list);
              multipleSheelPropety.setSheet(sheet);

              list1.add(multipleSheelPropety);

          }

          ExcelUtil.writeWithMultipleSheel("/home/chenmingjian/Downloads/aaa.xlsx",list1);

        工具類

        package com.springboot.utils.excel;

        import com.alibaba.excel.EasyExcelFactory;
        import com.alibaba.excel.ExcelWriter;
        import com.alibaba.excel.context.AnalysisContext;
        import com.alibaba.excel.event.AnalysisEventListener;
        import com.alibaba.excel.metadata.BaseRowModel;
        import com.alibaba.excel.metadata.Sheet;
        import lombok.Data;
        import lombok.Getter;
        import lombok.Setter;
        import lombok.extern.slf4j.Slf4j;
        import org.springframework.util.CollectionUtils;
        import org.springframework.util.StringUtils;

        import java.io.*;
        import java.util.ArrayList;
        import java.util.Collections;
        import java.util.List;

        /**
         * @description:
         * @author: chenmingjian
         * @date: 19-3-18 16:16
         */

        @Slf4j
        public class ExcelUtil {

           private static Sheet initSheet;

           static {
              initSheet = new Sheet(10);
              initSheet.setSheetName("sheet");
              //設(shè)置自適應(yīng)寬度
              initSheet.setAutoWidth(Boolean.TRUE);
           }

           /**
            * 讀取少于1000行數(shù)據(jù)
            * @param filePath 文件絕對(duì)路徑
            * @return
            */

           public static List<Object> readLessThan1000Row(String filePath){
              return readLessThan1000RowBySheet(filePath,null);
           }

           /**
            * 讀小于1000行數(shù)據(jù), 帶樣式
            * filePath 文件絕對(duì)路徑
            * initSheet :
            *      sheetNo: sheet頁(yè)碼,默認(rèn)為1
            *      headLineMun: 從第幾行開始讀取數(shù)據(jù),默認(rèn)為0, 表示從第一行開始讀取
            *      clazz: 返回?cái)?shù)據(jù)List<Object> 中Object的類名
            */

           public static List<Object> readLessThan1000RowBySheet(String filePath, Sheet sheet){
              if(!StringUtils.hasText(filePath)){
                 return null;
              }

              sheet = sheet != null ? sheet : initSheet;

              InputStream fileStream = null;
              try {
                 fileStream = new FileInputStream(filePath);
                 return EasyExcelFactory.read(fileStream, sheet);
              } catch (FileNotFoundException e) {
                 log.info("找不到文件或文件路徑錯(cuò)誤, 文件:{}", filePath);
              }finally {
                 try {
                    if(fileStream != null){
                       fileStream.close();
                    }
                 } catch (IOException e) {
                    log.info("excel文件讀取失敗, 失敗原因:{}", e);
                 }
              }
              return null;
           }

           /**
            * 讀大于1000行數(shù)據(jù)
            * @param filePath 文件覺得路徑
            * @return
            */

           public static List<Object> readMoreThan1000Row(String filePath){
              return readMoreThan1000RowBySheet(filePath,null);
           }

           /**
            * 讀大于1000行數(shù)據(jù), 帶樣式
            * @param filePath 文件覺得路徑
            * @return
            */

           public static List<Object> readMoreThan1000RowBySheet(String filePath, Sheet sheet){
              if(!StringUtils.hasText(filePath)){
                 return null;
              }

              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("找不到文件或文件路徑錯(cuò)誤, 文件:{}", filePath);
              }finally {
                 try {
                    if(fileStream != null){
                       fileStream.close();
                    }
                 } catch (IOException e) {
                    log.error("excel文件讀取失敗, 失敗原因:{}", e);
                 }
              }
              return null;
           }

           /**
            * 生成excle
            * @param filePath  絕對(duì)路徑, 如:/home/chenmingjian/Downloads/aaa.xlsx
            * @param data 數(shù)據(jù)源
            * @param head 表頭
            */

           public static void writeBySimple(String filePath, List<List<Object>> data, List<String> head){
              writeSimpleBySheet(filePath,data,head,null);
           }

           /**
            * 生成excle
            * @param filePath 絕對(duì)路徑, 如:/home/chenmingjian/Downloads/aaa.xlsx
            * @param data 數(shù)據(jù)源
            * @param sheet excle頁(yè)面樣式
            * @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("找不到文件或文件路徑錯(cuò)誤, 文件:{}", filePath);
              }finally {
                 try {
                    if(writer != null){
                       writer.finish();
                    }

                    if(outputStream != null){
                       outputStream.close();
                    }

                 } catch (IOException e) {
                    log.error("excel文件導(dǎo)出失敗, 失敗原因:{}", e);
                 }
              }

           }

           /**
            * 生成excle
            * @param filePath 絕對(duì)路徑, 如:/home/chenmingjian/Downloads/aaa.xlsx
            * @param data 數(shù)據(jù)源
            */

           public static void writeWithTemplate(String filePath, List<? extends BaseRowModel> data){
              writeWithTemplateAndSheet(filePath,data,null);
           }

           /**
            * 生成excle
            * @param filePath 絕對(duì)路徑, 如:/home/chenmingjian/Downloads/aaa.xlsx
            * @param data 數(shù)據(jù)源
            * @param sheet excle頁(yè)面樣式
            */

           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("找不到文件或文件路徑錯(cuò)誤, 文件:{}", filePath);
              }finally {
                 try {
                    if(writer != null){
                       writer.finish();
                    }

                    if(outputStream != null){
                       outputStream.close();
                    }
                 } catch (IOException e) {
                    log.error("excel文件導(dǎo)出失敗, 失敗原因:{}", e);
                 }
              }

           }

           /**
            * 生成多Sheet的excle
            * @param filePath 絕對(duì)路徑, 如:/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("找不到文件或文件路徑錯(cuò)誤, 文件:{}", filePath);
              }finally {
                 try {
                    if(writer != null){
                       writer.finish();
                    }

                    if(outputStream != null){
                       outputStream.close();
                    }
                 } catch (IOException e) {
                    log.error("excel文件導(dǎo)出失敗, 失敗原因:{}", e);
                 }
              }

           }


           /*********************匿名內(nèi)部類開始,可以提取出去******************************/

           @Data
           public static class MultipleSheelPropety{

              private List<? extends BaseRowModel> data;

              private Sheet sheet;
           }

           /**
            * 解析監(jiān)聽器,
            * 每解析一行會(huì)回調(diào)invoke()方法。
            * 整個(gè)excel解析結(jié)束會(huì)執(zhí)行doAfterAllAnalysed()方法
            *
            * @author: chenmingjian
            * @date: 19-4-3 14:11
            */

           @Getter
           @Setter
           public static class ExcelListener extends AnalysisEventListener {

              private List<Object> datas = new ArrayList<>();

              /**
               * 逐行解析
               * object : 當(dāng)前行的數(shù)據(jù)
               */

              @Override
              public void invoke(Object object, AnalysisContext context) {
                 //當(dāng)前行
                 // context.getCurrentRowNum()
                 if (object != null) {
                    datas.add(object);
                 }
              }


              /**
               * 解析完所有數(shù)據(jù)后會(huì)調(diào)用該方法
               */

              @Override
              public void doAfterAllAnalysed(AnalysisContext context) {
                 //解析結(jié)束銷毀不用的資源
              }

           }

           /************************匿名內(nèi)部類結(jié)束,可以提取出去***************************/

        }

        測(cè)試類

        package com.springboot.utils.excel;

        import com.alibaba.excel.annotation.ExcelProperty;
        import com.alibaba.excel.metadata.BaseRowModel;
        import com.alibaba.excel.metadata.Sheet;
        import lombok.Data;
        import lombok.EqualsAndHashCode;
        import org.junit.runner.RunWith;
        import org.springframework.boot.test.context.SpringBootTest;
        import org.springframework.test.context.junit4.SpringRunner;

        import java.util.ArrayList;
        import java.util.Arrays;
        import java.util.List;

        /**
         * @description: 測(cè)試類
         * @author: chenmingjian
         * @date: 19-4-4 15:24
         */

        @SpringBootTest
        @RunWith(SpringRunner.class)
        public class Test 
        {

            /**
             * 讀取少于1000行的excle
             */

            @org.junit.Test
            public void readLessThan1000Row()
        {
                String filePath = "/home/chenmingjian/Downloads/測(cè)試.xlsx";
                List<Object> objects = ExcelUtil.readLessThan1000Row(filePath);
                objects.forEach(System.out::println);
            }

            /**
             * 讀取少于1000行的excle,可以指定sheet和從幾行讀起
             */

            @org.junit.Test
            public void readLessThan1000RowBySheet()
        {
                String filePath = "/home/chenmingjian/Downloads/測(cè)試.xlsx";
                Sheet sheet = new Sheet(11);
                List<Object> objects = ExcelUtil.readLessThan1000RowBySheet(filePath,sheet);
                objects.forEach(System.out::println);
            }

            /**
             * 讀取大于1000行的excle
             * 帶sheet參數(shù)的方法可參照測(cè)試方法readLessThan1000RowBySheet()
             */

            @org.junit.Test
            public void readMoreThan1000Row()
        {
                String filePath = "/home/chenmingjian/Downloads/測(cè)試.xlsx";
                List<Object> objects = ExcelUtil.readMoreThan1000Row(filePath);
                objects.forEach(System.out::println);
            }


            /**
             * 生成excle
             * 帶sheet參數(shù)的方法可參照測(cè)試方法readLessThan1000RowBySheet()
             */

            @org.junit.Test
            public void writeBySimple()
        {
                String filePath = "/home/chenmingjian/Downloads/測(cè)試.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(filePath,data,head);
            }


            /**
             * 生成excle, 帶用模型
             * 帶sheet參數(shù)的方法可參照測(cè)試方法readLessThan1000RowBySheet()
             */

            @org.junit.Test
            public void writeWithTemplate()
        {
                String filePath = "/home/chenmingjian/Downloads/測(cè)試.xlsx";
                ArrayList<TableHeaderExcelProperty> data = new ArrayList<>();
                for(int i = 0; i < 4; i++){
                    TableHeaderExcelProperty tableHeaderExcelProperty = new TableHeaderExcelProperty();
                    tableHeaderExcelProperty.setName("cmj" + i);
                    tableHeaderExcelProperty.setAge(22 + i);
                    tableHeaderExcelProperty.setSchool("清華大學(xué)" + i);
                    data.add(tableHeaderExcelProperty);
                }
                ExcelUtil.writeWithTemplate(filePath,data);
            }


            /**
             * 生成excle, 帶用模型,帶多個(gè)sheet
             */

            @org.junit.Test
            public void writeWithMultipleSheel()
        {
                ArrayList<ExcelUtil.MultipleSheelPropety> list1 = new ArrayList<>();
                for(int j = 1; j < 4; j++){
                    ArrayList<TableHeaderExcelProperty> list = new ArrayList<>();
                    for(int i = 0; i < 4; i++){
                        TableHeaderExcelProperty tableHeaderExcelProperty = new TableHeaderExcelProperty();
                        tableHeaderExcelProperty.setName("cmj" + i);
                        tableHeaderExcelProperty.setAge(22 + i);
                        tableHeaderExcelProperty.setSchool("清華大學(xué)" + i);
                        list.add(tableHeaderExcelProperty);
                    }

                    Sheet sheet = new Sheet(j, 0);
                    sheet.setSheetName("sheet" + j);

                    ExcelUtil.MultipleSheelPropety multipleSheelPropety = new ExcelUtil.MultipleSheelPropety();
                    multipleSheelPropety.setData(list);
                    multipleSheelPropety.setSheet(sheet);

                    list1.add(multipleSheelPropety);

                }

                ExcelUtil.writeWithMultipleSheel("/home/chenmingjian/Downloads/aaa.xlsx",list1);

            }


            /*******************匿名內(nèi)部類,實(shí)際開發(fā)中該對(duì)象要提取出去**********************/
            
            
            /**
             * @description:
             * @author: chenmingjian
             * @date: 19-4-3 14:44
             */

            @EqualsAndHashCode(callSuper = true)
            @Data
            public static class TableHeaderExcelProperty extends BaseRowModel {

                /**
                 * value: 表頭名稱
                 * index: 列的號(hào), 0表示第一列
                 */

                @ExcelProperty(value = "姓名", index = 0)
                private String name;

                @ExcelProperty(value = "年齡",index = 1)
                private int age;

                @ExcelProperty(value = "學(xué)校",index = 2)
                private String school;
            }

            /*******************匿名內(nèi)部類,實(shí)際開發(fā)中該對(duì)象要提取出去**********************/

        }


        推薦閱讀

        一鍵生成Springboot & Vue項(xiàng)目!【畢設(shè)神器】



        END


        順便給大家推薦一個(gè)GitHub項(xiàng)目,這個(gè) GitHub 整理了上千本常用技術(shù)PDF,絕大部分核心的技術(shù)書籍都可以在這里找到,

        GitHub地址:https://github.com/javadevbooks/books

        Gitee地址:https://gitee.com/javadevbooks/books

        電子書已經(jīng)更新好了,你們需要的可以自行下載了,記得點(diǎn)一個(gè)star,持續(xù)更新中..



        瀏覽 33
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            寂寞少妇野外野战正片 | 欧美久久电影 | 日AV天天影院 | 操女人电影 | 色婷婷偷拍 | 亚洲综合中文字幕在线 | 波多野结衣av中文字幕 | 亚洲美穴 | 国产精品呻吟久久av凹凸 | 欧美三级手机在线 |