[EasyExcel] EasyExcel의 우아한 조작 Excel을 어떻게 활용하는지 백그라운드 개발

37964 단어 개발 도구

기사 목록

  • 인용
  • 우아한 엑셀 읽기
  • 우아한 엑셀 쓰기
  • 우아한 매듭
  • 조금만 관심을 가져도 길을 잃지 않는다

  • 인용문


    Easy Excel은 현재 성능이 가장 좋은 Excel 내보내기 도구입니다. 이 소협은 백그라운드 개발에서 Easy Excel을 우아하게 사용할 수 있도록 안내합니다.

    우아한 Excel 읽기


    백그라운드 인터페이스 읽기 문서는 일반적으로 MultipartFile 형식을 사용하며, 이 형식을 통해 InputStream 흐름을 구성할 수 있습니다.Easy Excel을 이용하여 Excel을 읽으려면 먼저 감청기를 만들어야 합니다. 훈남 루피는 이미 당신들을 도와 준비를 했습니다.
    import com.alibaba.excel.context.AnalysisContext;
    import com.alibaba.excel.event.AnalysisEventListener;
    import com.alibaba.fastjson.JSON;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @author Carson
     * @date 2020/6/4 21:26
     */
    public class ExcelReaderListener<T> extends AnalysisEventListener<T> {
        /**
         *  
         */
        private List<T> list = new ArrayList<>(1 << 6);
    
        /**
         *  spring, 。 Listener spring 
         */
        public ExcelReaderListener() {
        }
    
        /**
         *  
         *
         * @param data     
         * @param context Excel 
         */
        @Override
        public void invoke(T data, AnalysisContext context) {
            System.out.printf(" :{%s}", JSON.toJSONString(data));
            System.out.println();
            list.add(data);
        }
    
        /**
         *    
         *
         * @param context Excel 
         */
        @Override
        public void doAfterAllAnalysed(AnalysisContext context) {
        }
    
        public List<T> getList() {
            return list;
        }
    
        public void setList(List<T> list) {
            this.list = list;
        }
    }
    

    모니터를 만들면 Excel을 읽기 위한 도구 클래스를 수동으로 작성해야 합니다. 소협은 다음과 같은 두 가지 읽기 방식을 준비했습니다.
    import com.alibaba.excel.EasyExcel;
    
    import java.io.InputStream;
    import java.util.List;
    
    /**
     * @author Carson
     * @date 2020/6/4 21:31
     */
    public class ExcelReaderUtil<T> {
        private Class<T> clazz;
    
        public ExcelReaderUtil(Class<T> clazz) {
            this.clazz = clazz;
        }
    
        public List<T> readByStream(InputStream inputStream) {
            ExcelReaderListener<T> readerListener = new ExcelReaderListener<>();
            EasyExcel.read(inputStream, clazz, readerListener).sheet().doRead();
            return readerListener.getList();
        }
    
        public List<T> readByPath(String fileName) {
            ExcelReaderListener<T> readerListener = new ExcelReaderListener<>();
            EasyExcel.read(fileName, clazz, readerListener).sheet().doRead();
            return readerListener.getList();
        }
    }
    

    비고: 소협 이곳의 코드는 모두 범용적이어서 자세히 보기 싫은 것은 직접 복사해서 사용할 수 있다.
    기본 읽기 도구 클래스가 완성되었습니다. 그 다음은 템플릿 클래스의 생성입니다. 템플릿 클래스는 무엇입니까? 각 Excel 헤더에 따라 다른 매개 변수가 표시된 클래스입니다. 매개 변수는 @Excel Property 주석으로 수식되고 주석의 괄호 안의 내용은 Excel 헤더입니다.
    @Data
    public class GoodsReaderModel {
        @ExcelProperty(" SKU")
        public Long skuId;
    
        @ExcelProperty(" ")
        public String startTime;
    
        @ExcelProperty(" ")
        public String finishTime;
    }
    

    인터페이스에서 읽기:
        @RequestMapping(value = "/import", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
        @ApiOperation(value = " ", httpMethod = "POST", notes = " ")
        @ResponseBody
        public List<GoodsReaderModel > importGoodsFromExcel(@RequestParam("excel") MultipartFile multipartFile, HttpServletRequest request) {
            if (multipartFile == null) {
                LOGGER.info(" Excel ");
                return null;
            }
            ExcelReaderUtil<GoodsReaderModel> excelReader = new ExcelReaderUtil<>(GoodsReaderModel.class);
            List<GoodsReaderModel> modelList = Lists.newArrayList();
            try {
                InputStream inputStream = multipartFile.getInputStream();
                modelList = excelReader.readByStream(inputStream);
            } catch (IOException e) {
                LOGGER.info(" , ");
                return null;
            }
            // 
        }
    

    우아한 쓰기 Excel


    인터페이스에서 Excel을 다운로드하는 것도 마찬가지로 우아할 수 있습니다. 먼저 일반적인 형식 처리 클래스를 첨부하십시오.
    import com.alibaba.excel.support.ExcelTypeEnum;
    import com.alibaba.excel.write.handler.WriteHandler;
    import com.alibaba.excel.write.metadata.WriteWorkbook;
    import com.alibaba.excel.write.metadata.style.WriteCellStyle;
    import com.alibaba.excel.write.metadata.style.WriteFont;
    import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
    import com.google.common.collect.Lists;
    import org.apache.poi.ss.usermodel.BorderStyle;
    import org.apache.poi.ss.usermodel.FillPatternType;
    import org.apache.poi.ss.usermodel.HorizontalAlignment;
    import org.apache.poi.ss.usermodel.IndexedColors;
    
    import javax.servlet.ServletOutputStream;
    import java.util.List;
    
    /**
     * @author Carson
     * @date 2020/6/5 19:39
     */
    public class ExcelWriterUtil {
    
        public WriteWorkbook workbookGenerator(ServletOutputStream outputStream) {
            WriteWorkbook workbook = new WriteWorkbook();
            workbook.setOutputStream(outputStream);
            workbook.setExcelType(ExcelTypeEnum.XLSX);
            workbook.setNeedHead(true);
    
            //  
            WriteCellStyle headWriteCellStyle = new WriteCellStyle();
            // 
            headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
            headWriteCellStyle.setBorderTop(BorderStyle.THIN);
            headWriteCellStyle.setBorderBottom(BorderStyle.THIN);
            headWriteCellStyle.setBorderLeft(BorderStyle.THIN);
            headWriteCellStyle.setBorderRight(BorderStyle.THIN);
            headWriteCellStyle.setFillBackgroundColor(IndexedColors.SKY_BLUE.getIndex());
            //  
            WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
            // 
            contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
            contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
            contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);
            contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);
            contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
            WriteFont writeFont = new WriteFont();
            writeFont.setFontName(" ");
            contentWriteCellStyle.setWriteFont(writeFont);
            contentWriteCellStyle.setFillPatternType(FillPatternType.NO_FILL);
            contentWriteCellStyle.setFillBackgroundColor(IndexedColors.SKY_BLUE.getIndex());
            //        
            HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
            List<WriteHandler> customWriteHandlerList = Lists.newArrayList();
            customWriteHandlerList.add(horizontalCellStyleStrategy);
            workbook.setCustomWriteHandlerList(customWriteHandlerList);
            return workbook;
        }
    }
    

    그리고 인터페이스 요청에 이렇게 쓸 수 있습니다.
       @RequestMapping(value = "export", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})
        @ApiOperation(value = " ", httpMethod = "GET", notes = " ")
        @ResponseBody
        public void exportData() {
           
                  // , List
                List<List<String>> resList = Lists.newArrayList();
    
            try{
                ServletOutputStream outputStream = response.getOutputStream();
               
                WriteWorkbook workbook = new ExcelWriterUtil().workbookGenerator(outputStream);
        
                ExcelWriter writer = new ExcelWriter(workbook);
                String fileName = new String("data");
                response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
                WriteSheet writeSheet = new WriteSheet();
                writeSheet.setSheetName(" ");
                writeSheet.setAutoTrim(true);
    
                writer.write(resList, writeSheet);
                writer.finish();
            } catch (IOException e) {
                LOGGER.error(" ", e);
            }
        }
    

    우아한 매듭


    EasyExcel은 도구류일 뿐 개인적으로는 스레드 탱크, 메시지 대기열 등 내용보다 중요성이 낮지만 개발 과정에서 능숙하게 사용할 수 있다는 것도 향기롭다.개인적으로 이것은 우리가 사용한 적이 있는 가장 유용하고 효율이 높은 Excel 도구 종류라고 생각한다.소협은 테스트를 한 적이 있다. EasyExcel은 백만 개의 데이터를 내보내는 데 60초 정도(현재 Excel은 최대 104만 개의 데이터를 수용), 전통적인 POI 기술은 몇 시간이 걸리고 메모리 최적화가 좋지 않아 큰 대상이 제때에 회수하지 못해 JVM의 FULL GC를 만들기 쉽다.

    조금만 관심을 가져도 길을 잃지 않는다

    좋은 웹페이지 즐겨찾기