EasyExcel导出多个sheet 并完成对指定sheet页进行操作

直接上效果图:

实体类代码:

复制代码
SheetInfoBean,java
java 复制代码
package com.ly.cloud.dto;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * @Author 
 * @Date Created in  2024/1/19 12:27
 * @DESCRIPTION:  YxThingsExportDto - YzExportDto - ZxExportDto  三个sheet
 * @Version V1.0
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SheetInfoBean {
    /**
     * sheet页名称
     */
    private String sheetName;

    /**
     * sheet标题bean
     */
    private Class<?> headClass;

    /**
     * sheet页数据
     */
    private List<?> dataList;
}

主要代码逻辑:

java 复制代码
            List<YxThingsExportDto> exportList = deCopyYxList(yxThingsList);
            List<ZxExportDto> zxExportList = deCopyZxList(zxList);
            List<YzExportDto> yzExportList = deCopyYzList(yzList);
            //上面这几个集合数3sheet表的数据  

            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            String fileName = URLEncoder.encode(filename, "UTF-8").replaceAll("\\+", "%20");
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");

            // 构造各个sheet页相关信息
            List<SheetInfoBean> sheetList = new LinkedList<>();
            sheetList.add(new SheetInfoBean("事项信息", YxThingsExportDto.class, exportList));
            sheetList.add(new SheetInfoBean("材料", ZxExportDto.class, zxExportList));
            sheetList.add(new SheetInfoBean("类型", YzExportDto.class, yzExportList));

            long start = System.currentTimeMillis();
            // 自动列宽 + 批注
            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();
            CompletableFuture<Void> previousFuture = getVoidCompletableFuture(sheetList, excelWriter);

            previousFuture.join(); // 等待所有sheet写入完成
            excelWriter.finish(); // 关闭资源

            long end = System.currentTimeMillis();
            System.out.println(end - start);

写入 多个sheet页面 ;

写入 3个 sheet页 的数据;并给指定的sheet加批注操作

java 复制代码
 private static CompletableFuture<Void> getVoidCompletableFuture(List<SheetInfoBean> sheetList, ExcelWriter excelWriter) {
        ReentrantLock lock = new ReentrantLock(false);

        CompletableFuture<Void> previousFuture = CompletableFuture.completedFuture(null);

        for (SheetInfoBean bean : sheetList) {
            CompletableFuture<Void> currentFuture = new CompletableFuture<>();

            previousFuture.thenAcceptAsync(ignored -> {
                lock.lock();
                try {
                    WriteSheet writeSheet = EasyExcel.writerSheet(bean.getSheetName())
                            .head(bean.getHeadClass())
                            .build();
                    // 给第一个: 事项类别信息 sheet 页添加批注
                    if ("事项信息".equals(bean.getSheetName())) {
                        List<WriteHandler> list = new ArrayList<>();
                        list.add(new YxCommentWriteHandler());
                        writeSheet.setCustomWriteHandlerList(list);
                    }
                    excelWriter.write(bean.getDataList(), writeSheet);
                } catch (Exception e) {
                    throw new BusinessException(e);
                } finally {
                    lock.unlock();
                    currentFuture.complete(null);
                }
            });
            previousFuture = currentFuture;
        }
        return previousFuture;
    }
相关推荐
毕设源码-朱学姐几秒前
【开题答辩全过程】以 骨科术后营养餐推荐系统为例,包含答辩的问题和答案
java
丶小鱼丶1 分钟前
数据结构和算法之【栈】
java·数据结构
web3.08889992 分钟前
taoxi商品详情|商品属性|包装规格信息 API接口
windows
希望永不加班14 分钟前
SpringBoot 核心配置文件:application.yml 与 application.properties
java·spring boot·后端·spring
liurunlin88842 分钟前
HeidiSQL导入与导出数据
java
leaves falling43 分钟前
有效的字母异位词
java·服务器·前端
我真会写代码44 分钟前
Spring面试高频题:从基础到源码,通俗拆解+避坑指南
java·spring·面试
huaweichenai1 小时前
java的时间操作介绍
java·开发语言
毕设源码-朱学姐1 小时前
【开题答辩全过程】以 基于SpringBoot+Vue的百货商品进出货平台为例,包含答辩的问题和答案
java·spring boot·后端
新手88601 小时前
Oracle VirtualBox虚拟机安装 和 安装 window11版本虚拟机 及 启用EFI和硬盘无法使用 问题
服务器·windows·计算机网络·安全·虚拟机