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

文章讲述了如何利用EasyExcel库在Java中创建并写入包含多个sheet(如事项信息、材料和类型)的Excel文件,同时为特定sheet添加批注的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接上效果图:

方法一:

实体类代码:

SheetInfoBean,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;
}

主要代码逻辑:


            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加批注操作

 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;
    }

方法二:

            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();
            WriteSheet sheet1 = EasyExcel.writerSheet(0, FILE_NAME).head(YxAdminExportDto.class)
                    .registerWriteHandler(new YxAdminWriteHandler())  // 批注
                    .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 自动列宽
                    .registerWriteHandler(new FormatSheetWriteHandler()) // 设置导出内容为文本格式
                    .build();
            WriteSheet sheet2 = EasyExcel.writerSheet(1, "部门参照表").head(UnitExcelDTO.class)
                    .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 自动列宽
                    .registerWriteHandler(new FormatSheetWriteHandler()) // 设置导出内容为文本格式
                    .build();
            excelWriter.write(yxThingsList, sheet1).write(unitExcelDTOList, sheet2);
            excelWriter.finish();

### 使用 EasyExcel 导出包含多个 Sheet 的 Excel 文件 为了实现使用 EasyExcel 导出包含多个工作表 (Sheet) 的 Excel 文件,可以通过创建不同的数据类来表示各个表格的数据结构,通过 `EasyExcel.write` 方法指定要写入的目标文件路径。对于每一个新的 Sheet 可以调用 `.sheet()` 来切换当前操作的工作表。 以下是具体的 Java 实现方式: #### 定义实体类 定义两个不同类型的实体类用于填充到各自对应的 Sheet 中去。 ```java public class DataOne { @ExcelProperty("字段名称1") private String fieldOne; // getter and setter methods... } public class DataTwo { @ExcelProperty("字段名称2") private Integer fieldTwo; // getter and setter methods... } ``` #### 编写导出逻辑 编写服务方法来进行多 sheet 数据的导出处理。 ```java import com.alibaba.excel.EasyExcel; import java.util.ArrayList; import java.util.List; public void exportMultiSheets(String fileName){ // 准备两组测试数据列表 List<DataOne> dataOnes = new ArrayList<>(); List<DataTwo> dataTwos = new ArrayList<>(); // 向这两个集合中添加模拟数据... try{ // 创建一个新的 Excel 写入器实例 EasyExcel.write(fileName) .registerWriteHandler(new CustomCellStyleStrategy()) // 如果需要自定义样式可注册处理器 .build() // 开始向第一个 Sheet 写入数据 .write(dataOnes, new DataOneFillListener()) .sheet("SheetName1") .doWrite(dataOnes) // 切换至第二个 Sheet 继续写入另一批数据 .sheet("SheetName2") .doWrite(dataTwos); } catch(Exception e){ throw new RuntimeException(e.getMessage(),e.getCause()); } } ``` 上述代码展示了如何利用 EasyExcel 库在一个 Excel 文件内创建多个带有不同类型数据的工作表[^3]。注意,在实际应用环境中应当根据业务需求调整相应的配置项和服务端点设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大大怪~将军

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值