小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
本文通过代码示例,介绍阿里巴巴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;
}