SpringBoot 에서 EasyExcel 은 Excel 파일 가 져 오기 내 보 내기 를 실현 합 니 다.

머리말
우리 가 일상적인 개발 과정 에서 Excel 파일 의 형식 으로 다운로드 시스템 데 이 터 를 대량으로 업로드 합 니 다.우리 가 가장 자주 사용 하 는 도 구 는 Apache poi 입 니 다.그러나 데이터 가 수백 만 에 달 할 때 메모리 가 넘 치 는 문 제 를 초래 할 수 있 습 니 다.그러면 우 리 는 어떻게 백만 데 이 터 를 대량으로 가 져 와 내 보 낼 수 있 습 니까?
본문
Easyexcel
Easyexcel 은 알 리 바 바 의 오픈 소스 프로젝트 로 Excel 파일 처리 과정 을 최적화 합 니 다.
  • poi 소모 메모리 심각:자바 분석,생 성 Excel 비교적 유명한 프레임 워 크 는 Apache poi,jxl 이다.그러나 그들 은 모두 심각 한 문제 가 존재 한다.바로 매우 많은 메모 리 를 소모 하 는 것 이다.poiSAX 모델 의 API 이 어느 정도 에 메모리 가 넘 치 는 문 제 를 해결 할 수 있 지만 poi 은 아직도 일부 결함 이 있다.예 를 들 어 07 판 Excel 의 압축 해제 와 압축 해제 후 저장 은 모두 메모리 에서 이 루어 졌 고 메모리 소 모 는 여전히 매우 크다.
  • easyexcel 은 메모리 에 최적화 되 었 습 니 다.poi 대 07 판 Excel 의 분석 을 다시 썼 습 니 다.원래 3M 이 었 던 excelPOI sax 으로 100 M 정도 의 메모리 가 필요 하고 더 큰 excel 은 메모리 가 넘 치지 않 습 니 다.
  • 在这里插入图片描述
    SpringBoot+EasyExcel 에서 Excel 파일 가 져 오기 내 보 내기 실현
    가 져 오기 의존
    
    <!--lombok-->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.2</version>
      <optional>true</optional>
    </dependency>
    
    <!--easyExcel-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>easyexcel</artifactId>
      <version>1.1.2-beat1</version>
    </dependency>
    
    <!--fastjson-->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <exclusions>
        <exclusion>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-annotations</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
    </dependency>
    
    Excel 파일 이 파괴 되 는 것 을 방지 하기 위해 pom.xml 에 다음 과 같은 내용 을 추가 합 니 다.
    
    <build>
      <plugins>
        <!--  maven   xls  ,       -->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-resources-plugin</artifactId>
          <configuration>
            <nonFilteredFileExtensions>
              <nonFilteredFileExtension>xls</nonFilteredFileExtension>
              <nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
            </nonFilteredFileExtensions>
          </configuration>
        </plugin>
      </plugins>
    </build>
    
    application.properties:프로필
    
    #temp files
    project.tmp.files.path=/Users/mac/Desktop/image/tmp/files/
    SpringBoot 시작 클래스 에 임시 파일 설정 추가
    
    @Value("${project.tmp.files.path}")
    public String filesPath;
    
    @Bean
    MultipartConfigElement multipartConfigElement() {
      MultipartConfigFactory factory = new MultipartConfigFactory();
      //    xxx
      factory.setLocation(filesPath);
      return factory.createMultipartConfig();
    }
    
    Excel Util:Excel 도구 클래스
    
    @Slf4j
    public class ExcelUtil {
      private static Sheet initSheet;
    
    
      static {
        initSheet = new Sheet(1, 0);
        initSheet.setSheetName("sheet");
        //       
        initSheet.setAutoWidth(Boolean.TRUE);
      }
    
      public static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {
        try {
          response.setCharacterEncoding("UTF-8");
          response.setContentType("application/octet-stream;charset=utf-8");
          response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
          workbook.write(response.getOutputStream());
        } catch (IOException e) {
          // throw new NormalException(e.getMessage());
        }
      }
    
    
      /**
       *     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;
        }
        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;
        }
        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;
      }
    
    
      /**
       *    1000   ,    
       *
       * @return
       */
      public static List<Object> readMoreThan1000RowBySheetFromInputStream(InputStream inputStream, Sheet sheet) {
        sheet = sheet != null ? sheet : initSheet;
        InputStream fileStream = null;
        ExcelListener excelListener = new ExcelListener();
        EasyExcelFactory.readBySax(inputStream, sheet, excelListener);
        return excelListener.getDatas();
      }
    
    
      /**
       *   excle
       *
       * @param filePath     
       * @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   
       * @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);
        } finally {
          try {
            if (writer != null) {
              writer.finish();
            }
    
            if (outputStream != null) {
              outputStream.close();
            }
    
          } catch (IOException e) {
            log.error("excel      ,     :{}", e);
          }
        }
      }
    
    
      /**
       *   excle
       *
       * @param filePath   
       * @param data      
       */
      public static void writeWithTemplate(String filePath, List<? extends BaseRowModel> data) {
        writeWithTemplateAndSheet(filePath, data, null);
      }
    
    
    
    
      /**
       *   excle
       *
       * @param filePath   
       * @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);
        } finally {
          try {
            if (writer != null) {
              writer.finish();
            }
            if (outputStream != null) {
              outputStream.close();
            }
          } catch (IOException e) {
            log.error("excel      ,     :{}", e);
          }
        }
    
    
    
    
      }
    
    
    
    
      /**
       *    Sheet excle
       *
       * @param filePath         
       * @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);
        } finally {
          try {
            if (writer != null) {
              writer.finish();
            }
    
            if (outputStream != null) {
              outputStream.close();
            }
          } catch (IOException e) {
            log.error("excel      ,     :{}", e);
          }
        }
      }
    
    
      /*********************       ,      ******************************/
      @Data
      public static class MultipleSheelPropety {
        private List<? extends BaseRowModel> data;
        private Sheet sheet;
      }
    
      /**
       *      ,
       *         invoke()  。
       *   excel       doAfterAllAnalysed()  
       *
       * @author: chenmingjian
       * @date: 19-4-3 14:11
       */
      @Getter
      @Setter
      public static class ExcelListener extends AnalysisEventListener {
        private List<Object> datas = new ArrayList<>();
    
    
        /**
         *     
         * object :       
         */
        @Override
        public void invoke(Object object, AnalysisContext context) {
          //   
          // context.getCurrentRowNum()
          if (object != null) {
            datas.add(object);
          }
        }
    
    
        /**
         *               
         */
        @Override
        public void doAfterAllAnalysed(AnalysisContext context) {
          //           
        }
    
      }
    
    
      /************************       ,      ***************************/
    }
    CommonUtil:도구 류
    
    public class CommonUtil {
    
    /**
     *   32   ,    
     *
     * @return uuid 
     */
    public static String getUUID() {
      String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
      return uuid.toUpperCase();
    }
    
    /**
     *               ,  :yyyy-MM-dd( - - )
     * @return             
     */
    public static String getTodayStr(){
      return new SimpleDateFormat("yyyy-MM-dd").format(new Date()) ;
    }
    
    /**
     *       json
     *
     * @param t
     * @return
     * @throws JsonProcessingException
     */
    public static <T> String toJson(T t) throws JsonProcessingException {
      return OBJECT_MAPPER.get().writeValueAsString(t);
    }
    
    }
    UserPojoRes:실체 클래스
    
    @Setter
    @Getter
    @ToString
    public class UserPojoRes extends BaseRowModel implements Serializable {
      private static final long serialVersionUID = -2145503717390503506L;
    
      /**
       *   
       */
      @ExcelProperty(value = "ID", index = 0)
      private String id;
      /**
       *   
       */
      @ExcelProperty(value = "   ", index = 1)
      private String name;
    
      public UserPojoRes(String id, String name) {
        this.id = id;
        this.name = name;
      }
    
      public UserPojoRes(){
    
    
      }
    }
    
    검증 하 다.
    템 플 릿 다운로드
    여기에 템 플 릿 파일 을 resources 에 놓 습 니 다.
    
    @GetMapping("/exportExcelTempalte")
    @ApiOperation(value = "      ")
    public void exportExcelTempalte(HttpServletResponse response) throws Exception {
      //Resource      
      String filePath = "/excels/    .xlsx";
      ClassPathResource classPathResource = new ClassPathResource(filePath);
      Workbook workbook=WorkbookFactory.create(classPathResource.getInputStream());
      ExcelUtil.downLoadExcel("    .xlsx", response, workbook);
    }
    
    Excel 파일 가 져 오기
    
    @PostMapping("/importExcel")
    @ApiOperation(value = "Excel    ")
    public Response importExcel(HttpServletRequest request, MultipartFile file, HttpServletResponse response) throws Exception {
      List<Object> objects = ExcelUtil.readMoreThan1000RowBySheetFromInputStream(file.getInputStream(),null);
      List<UserPojoRes> list = new ArrayList<>();
      for (Object o : objects) {
        UserPojoRes userPojoRes = new UserPojoRes();
        List<String> stringList = (List<String>) o;
        userPojoRes.setId(stringList.get(0) != null ? stringList.get(0).toString() : "");
        userPojoRes.setName(stringList.get(1) != null ? stringList.get(0).toString() : "");
        list.add(userPojoRes);
      }
      String json = CommonUtil.toJson(list);
      return new Response(json);
    }
    
    在这里插入图片描述
    Excel 파일 내 보 내기
    
    @Value("${project.tmp.files.path}")
    public String filesPath;
    
    @GetMapping("/exportExcel")
    @ApiOperation(value = "Excel    ")
    public void exportExcel(HttpServletResponse response) throws Exception {
    
      //      
      String path = filesPath + CommonUtil.getUUID() + ".xlsx";
      List<UserPojoRes> list = new ArrayList<>();
      UserPojoRes userPojoRes = new UserPojoRes("009", "  ");
      UserPojoRes userPojoRes1 = new UserPojoRes("009", "  ");
      list.add(userPojoRes);
      list.add(userPojoRes1);
      ExcelUtil.writeWithTemplate(path, list);
      //   excel    
      Workbook workbook = WorkbookFactory.create(new FileInputStream(path));
      String fileName = "    " + CommonUtil.getTodayStr() + ".xlsx";
      ExcelUtil.downLoadExcel(fileName, response, workbook);
    }
    
    在这里插入图片描述
    SpringBoot 에서 Easy Excel 이 Excel 파일 의 가 져 오기 내 보 내기 를 실현 하 는 것 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 Excel 파일 가 져 오기 내 보 내기 내용 은 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기