阿里巴巴easyexcel,高性能excel操作工具的使用

353 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

本文通过代码示例,介绍阿里巴巴easyexcel,高性能excel操作工具的对excel的导入和导出使用

首先pom文件中引入相关依赖

        <!--easyexcel-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.1.4</version>
        </dependency>

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>

创建excel读取监听类

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.exception.ExcelAnalysisException;
import com.sun.collierycommon.utils.EasyExcelValidateHelper;
import org.apache.commons.lang3.StringUtils;

/**
 * @Description:
 * @Author: Tarzan Liu
 * @Date: 2020/1/2 15:49
 */

public class ExcelListener<T> extends AnalysisEventListener<T> {


        //验证工具
        private EasyExcelValidateHelper excelCheckManager;



        /**
         * 这个每一条数据解析都会来调用
         *
         * @param data
         * @param context
         */
        @Override
        public void invoke(T data, AnalysisContext context) {
                String errMsg;
                try {
                        //根据excel数据实体中的javax.validation + 正则表达式来校验excel数据
                        errMsg = EasyExcelValidateHelper.validateEntity(data);
                } catch (NoSuchFieldException e) {
                        errMsg = "解析数据出错";
                        throw new ExcelAnalysisException("解析excel出错,请传入正确格式的excel");
                }
                if (!StringUtils.isBlank(errMsg)){
                        throw new ExcelAnalysisException(errMsg);
                }
        }

        /**
         * 所有数据解析完成了 都会来调用
         *
         * @param context
         */
        @Override
        public void doAfterAllAnalysed(AnalysisContext context) {
               // System.out.println(JSON.toJSONString(list));
        }


}

excel的读取方法

	public ResponseDTO<String> importExcel(MultipartFile file) throws IOException {
		List<QualityAcceptanceSpecificationExcelDTO> rows= EasyExcel.read(file.getInputStream(), QualityAcceptanceSpecificationExcelDTO.class,new ExcelListener()).sheet().doReadSync();
		if(CollectionUtils.isNotEmpty(rows)){
			List<QualityAcceptanceSpecificationEntity > list=rows.stream().map(item->{
				QualityAcceptanceSpecificationEntity entity=SmartBeanUtil.copy(item,QualityAcceptanceSpecificationEntity .class);
				return entity;
			}).collect(Collectors.toList());
			if(list.size()>20000){
				return ResponseDTO.wrap(ResponseCodeConst.ERROR,"文件过大,请上传小于20000条的excel");
			}
			//插入数据库
			this.insertBatch(list);
		}
		return ResponseDTO.succ();

	}

excel的导出方法

	/**
	 * 方法描述:导出检索结果
	 *
	 * @param queryDTO
	 * @Return {@link CommonResponseDTO< String>}
	 * @throws
	 * @author tarzan Liu
	 * @date 2020年07月29日 14:36:35
	 */
    public CommonResponseDTO<String> export(QualityAcceptanceSpecificationQueryDTO queryDTO, HttpServletResponse response) {
		List<QualityAcceptanceSpecificationListDTO> resultList = qualityAcceptanceSpecificationMapper.pageList(null, queryDTO);
		List<QualityAcceptanceSpecificationExcelDTO> rows =resultList.stream().map(e->{
			QualityAcceptanceSpecificationExcelDTO dto= BeanUtil.copy(e,QualityAcceptanceSpecificationExcelDTO.class);
			return dto;
		}).collect(Collectors.toList());
		try {
			String fileName = URLEncoder.encode("导出的文件.xlsx", "UTF-8");
			response.setHeader("Content-disposition", "attachment; filename*=UTF-8''" + fileName);
			EasyExcel.write(response.getOutputStream(), QualityAcceptanceSpecificationExcelDTO.class).sheet("sheet").doWrite(rows);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return CommonResponseDTO.forSuccess();
	}

excelDTO对象(注解名称和读取的excel列明一致,或者用index下表和excel的列数一致)

package com.tulian.cim6d.quality.safety.dto.quality.specific;

import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.Date;

/**  
 * 验收规范ExcelDTO
 *  
 * @version 1.0  
 * @since JDK1.8
 * @author tarzan Liu
 * @copyright (c) 2020 Bimfish (Beijing) Digital Technology Co'LTD.All rights reserved.
 * @date 2020年02月04日 16:08:35
 */
@Data
public class QualityAcceptanceSpecificationExcelDTO {


	/**
	 *规范编号
	 */
	@ExcelProperty("规范编号")
	private String specificationNumber;
	/** 规范名称 */
	@ExcelProperty("规范名称")
	private String specificationName;
	/**
	 * 类别(1:国家标准 2 行业标准 3 地方标准 4 企业标准)
	 */
	@ExcelProperty("类别(1:国家标准 2 行业标准 3 地方标准 4 企业标准)")
	private Integer category;


	@ExcelProperty("创建人名称")
	private String creatorName;

	@ExcelProperty("创建时间")
	private Date createTime;

	@ExcelProperty("批注状态")
	private Integer notationStatus;


}