通用FastEasyExcel导出功能实现

Published on
114 11~14 min

IDEA 启动

添加pom依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.1.2</version>
</dependency>
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.18</version>
</dependency>

注解

@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface EasyExcelExport {
    /**
     * 文件名称
     */
    String fileName() default "";
} 

饿死配科特

@Aspect
@Component
public class ExcelExportAspect {

    /**
     * 是否导出
     */
    private static final String IS_EXPORT = "IS_EXPORT";
    /**
     * 导出表头
     */
    private static final String TITLE_NAME = "TITLE_NAME";
    /**
     * 对应字段名
     */
    private static final String FIELD_NAME = "FIELD_NAME";
    /**
     * 附件名称
     */
    private static final String FILE_NAME = "FILE_NAME";

    @AfterReturning(returning = "obj", value = "@annotation(excelExport)")
    public void excelExport(Object obj, EasyExcelExport excelExport) throws IOException {
        //获取request与response对象
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = Objects.requireNonNull(attributes).getRequest();
        String title = request.getParameter(TITLE_NAME);
        String filed = request.getParameter(FIELD_NAME);
        //确定是否导出
        if (Boolean.parseBoolean(request.getParameter(IS_EXPORT))) {
            HttpServletResponse response = Objects.requireNonNull(attributes).getResponse();
            //key:表头名 value:字段名
            Map<String, Object> exportName = new HashMap<>(16);
            //第一种:用户自定义导出,必须保证表头和字段名对应
            if (!StringUtils.isEmpty(title) || !StringUtils.isEmpty(request.getHeader(filed))) {
                String[] titleLen = title.split(",");
                for (int i = 0; i < titleLen.length; i++) {
                    exportName.put(titleLen[i], filed.split(",")[i]);
                }
            } else {
                Field[] declaredFields = ((PageInfo) ((DataResult) obj).getData()).getList().get(0).getClass().getDeclaredFields();
                for (Field declaredField : declaredFields) {
                    if (!"serialVersionUID".equals(declaredField.getName())) {
                        ApiModelProperty modelProperty = declaredField.getAnnotation(ApiModelProperty.class);
                        exportName.put(modelProperty == null ? declaredField.getName() : modelProperty.value(), declaredField.getName());
                    }
                }
            }
            //处理返回结果集
            JSONObject resObj = JSONUtil.parseObj(obj, false);
            Object data = resObj.get("data");
            if (data instanceof JSONObject) {
                JSONArray records = JSONUtil.parseArray(JSONUtil.parseObj(data).get("list"));
                String fileName = URLEncoder.encode("".equals(excelExport.fileName()) ? UUID.randomUUID().toString() : excelExport.fileName(), StandardCharsets.UTF_8.name()).replaceAll("\\+", "%20");
                if (!StringUtils.isEmpty(request.getParameter(FILE_NAME))) {
                    fileName = request.getParameter(FILE_NAME);
                }
                response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");
                response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ExcelTypeEnum.XLSX.getValue());
                List<List<Object>> dataList = EasyExcelUtil.dataList(exportName, records);
                EasyExcelFactory.write(response.getOutputStream()).sheet("Sheet1").registerWriteHandler(new IEasyExcelHandler()).head(EasyExcelUtil.headList(exportName)).doWrite(dataList);
            }
        }
    }
}

使用方式

@MyLog(title = "分页查询", action = "分页查询")
@ApiOperation(value = "分页查询", notes = "分页查询")
@PostMapping("/queryRectifyList")
@EasyExcelExport
public DataResult queryRectifyList(@RequestBody HiddenRectifyInfoQueryBO queryBO) {
    return DataResult.success(hiddenRectifyInfoService.queryRectifyList(queryBO));
}

前端使用方式

curl --request POST \
  --url 'http://localhost:18084/risk/hiddenRectify/queryRectifyList?TITLE_NAME=隐患发现时间,所属企业,整改标题&FIELD_NAME=registTime,companyName,dangerName&FILE_NAME=隐患治理表格&IS_EXPORT=true' \
  --header 'Authorization: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIyZxxxxxx' \
  --header 'content-type: application/json' \
  --data '{
	"pageNum": 1,
	"pageSize": 10
}'