EasyExcel 动态设置多sheet名称

文章介绍了如何使用阿里巴巴的ExcelWriteHandler在Java中动态设置Excelsheet的名称,通过创建自定义的`CustomTemplateSheetStrategy`类并注册到`SheetWriteHandler`中,实现了在模板导出时修改或新增sheet的名字。示例代码展示了在EasyExcel库的帮助下,如何处理多个sheet并动态命名。

在这里插入图片描述

目录

说明

单个excel多sheet下载案例

本文章基于上个案例来说,链接在上面。
在这里插入图片描述
如果改动了这里可以发现,其实对sheet的名字并不影响,所以这是个伪代码,那么怎么去动态设置sheet的名称呢,肯定会有这种需求,网上案例也有,那我就基于我上一篇案例来继续说明,如何动态设置sheet名称。

主要类:

import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;

/**
 * 自定义模板导出sheet拦截器
 */
public class CustomTemplateSheetStrategy implements SheetWriteHandler {
   
   

    private Integer sheetNo;

    private String sheetName;

    public CustomTemplateSheetStrategy(String sheetName) {
   
   
        this.sheetName = sheetName;
    }

    public CustomTemplateSheetStrategy(Integer sheetNo, String sheetName) {
   
   
        this.sheetNo = sheetNo;
        this.sheetName = sheetName;
    }

    @Override
    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
   
   
    }

    /**
     * 功能:动态修改模板中sheet的名称
     * sheet创建完成后调用
     *
     * @param writeWorkbookHolder
     * @param writeSheetHolder
     */
    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
   
   
        if (sheetName == null) {
   
   
            return;
        }
        if (sheetNo == null) {
   
   
            sheetNo = 0;
        }
        //往哪个sheet设置名称
        writeWorkbookHolder.getCachedWorkbook().setSheetName(sheetNo, sheetName);
    }
}

controller:

<
<think>根据提供的引用内容,用户希望了解如何使用EasyExcel根据sheet名称读取数据。引用中提到了几种读取sheet的方法,包括通过sheet索引和sheet名称。特别地,引用[2]和引用[3]展示了如何通过名称或索引指定要读取的sheet。 在引用[2]中,使用了`EasyExcel.readSheet("1")`,这里的`"1"`是sheet名称,而不是索引(索引是从0开始的整数)。同样,引用[3]中使用了`EasyExcel.readSheet(3)`,这里的3是sheet的索引(从0开始)。 因此,根据sheet名称读取数据,我们可以使用`EasyExcel.readSheet(sheetName)`方法,其中`sheetName`是字符串类型的sheet名称。 下面将按照用户要求,使用中文回答,并遵循格式要求。</think>### EasyExcel 根据 Sheet 名称读取数据 使用 EasyExcel 根据 Sheet 名称读取数据,可通过以下两种方式实现: #### 方法一:直接指定 Sheet 名称(推荐) ```java // 1. 创建 ExcelReader 实例 ExcelReader excelReader = EasyExcel.read(inputStream).build(); // 2. 通过 sheet 名称指定要读取的工作表 String targetSheetName = "员工数据"; // 替换为实际 Sheet 名称 ReadSheet readSheet = EasyExcel.readSheet(targetSheetName) .headRowNumber(1) // 表头行号(从0计数) .head(Employee.class) // 数据映射类 .registerReadListener(new AnalysisEventListener<Employee>() { @Override public void invoke(Employee data, AnalysisContext context) { // 单行数据处理 } @Override public void doAfterAllAnalysed(AnalysisContext context) { // 所有数据解析完成 } }) .build(); // 3. 执行读取 excelReader.read(readSheet); excelReader.finish(); // 必须关闭资源 ``` #### 方法二:读取所有 Sheet 后筛选 ```java List<ReadSheet> sheets = EasyExcel.read(inputStream) .build() .excelExecutor() .sheetList(); for (ReadSheet sheet : sheets) { if ("财务报表".equals(sheet.getSheetName())) { // 匹配目标名称 List<FinancialData> data = EasyExcel.read(inputStream) .sheet(sheet.getSheetName()) .head(FinancialData.class) .doReadSync(); // 同步读取 System.out.println(data); } } ``` #### 关键参数说明: 1. **`.readSheet("名称")`** 直接指定 Sheet 名称(区分大小写) 2. **`.headRowNumber(N)`** 设置表头行号(0-based),控制从哪行开始解析数据 3. **`.head(Class)`** 声明数据映射的实体类 4. **`registerReadListener`** 注册监听器处理解析事件(异步流式读取) 5. **`doReadSync()`** 同步读取方式(适合小数据量) > ⚠️ 注意事项: > - 确保名称完全匹配(包括空格和特殊字符) > - 读取后必须调用 `excelReader.finish()` 释放资源[^2] > - 大数据量(>1万行)推荐使用监听器模式避免内存溢出[^3]
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值