easyExcel多sheet页导入

/**
 * Description: 获取日前交易excel数据
 *
 * @param file
 * @return
 */
private Map<String,List<SpotDailyDealImportVO>> SpotDailyDealLoadExcelData(MultipartFile file){



    Map<String,List<SpotDailyDealImportVO>> map = new HashMap<>();
    try {
        //获取所有sheet页
        List<ReadSheet> readSheets = ExcelImportHelper.listSheet(file.getInputStream());
        List<ReadSheet> arrayList = readSheets.stream().collect(
                // 将集合先放到 treeSet去重,然后将他们转换成list
                collectingAndThen(
                        toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getSheetName())))
                        , ArrayList::new));
        if (arrayList.size() < readSheets.size()){
            throw new BusinessException("存在相同机组名称!");
        }
        if (ObjectUtils.isNotEmpty(readSheets)){
            //读取数据
            int i = 0;//从第一页开始读
            for (ReadSheet readSheet : readSheets){
                map.put(readSheet.getSheetName(),ExcelImportHelper.loadExcelDataFully(
                        ExcelImportHelper.getExcelTypeByName(file.getOriginalFilename()), file.getInputStream(), i ,
                        MagicNumConstant.ONE, SpotDailyDealImportVO.class));
                i++;
            }
        }else throw new BusinessException("无法获取到sheet页信息!");
    } catch (IOException e) {
        log.error("error",e);
        throw new BusinessException("上传文件格式不正确" + e.getMessage());
    }
    if (map.size() == 0){
        throw new BusinessException("数据异常,没有数据!");
    }

    return map;
}

工具类

/*
 * Project Name: fsc
 * File Name: ExcelImportHelper.java
 * Class Name: ExcelImportHelper
 *
 * Copyright 2018 Hengtian Software Inc
 *
 * Licensed under the Hengtiansoft
 *
 * http://www.hengtiansoft.com
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES 
### 使用EasyExcel实现Sheet导入的功能 #### 1. 添加依赖 为了使用EasyExcel库,首先需要引入Maven或Gradle中的相关依赖。以下是Maven配置示例: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.0.5</version> </dependency> ``` 此部分可以参考相关内容[^2]。 --- #### 2. 定义实体类 在EasyExcel中,`@ExcelProperty`注解用于指定列名以及映射到Java对象的属性。以下是一个简单的实体类定义示例: ```java import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; @Data public class SheetData { @ExcelProperty("姓名") private String name; @ExcelProperty("年龄") private Integer age; @ExcelProperty("性别") private String gender; } ``` 上述代码展示了如何通过`@ExcelProperty`来绑定Excel表格中的列与Java对象的字段关系[^4]。 --- #### 3. 创建监听器 在Sheet导入场景下,通常会为每个Sheet创建对应的监听器。下面展示了一个通用的监听器设计模式: ```java import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import java.util.ArrayList; import java.util.List; public class SheetListener extends AnalysisEventListener<SheetData> { private List<SheetData> dataList = new ArrayList<>(); @Override public void invoke(SheetData data, AnalysisContext context) { dataList.add(data); } @Override public void doAfterAllAnalysed(AnalysisContext context) { System.out.println("所有数据解析完成!"); } public List<SheetData> getDataList() { return dataList; } } ``` 该监听器负责逐条读取每张表的数据并存储至内存列表中。 --- #### 4. 编写核心逻辑 接下来编写一个Sheet导入的核心方法,利用循环遍历Sheet的内容: ```java import com.alibaba.excel.EasyExcel; import com.alibaba.excel.read.builder.ExcelReaderBuilder; import com.alibaba.excel.read.metadata.ReadSheet; import java.util.ArrayList; import java.util.List; public class MultiSheetImportExample { public static List<List<SheetData>> importMultiSheets(String fileName) { ExcelReaderBuilder readerBuilder = EasyExcel.read(fileName); List<List<SheetData>> result = new ArrayList<>(); // 假设我们有两张表分别对应不同的实体类 ReadSheet sheet1 = EasyExcel.readSheet(0).head(SheetData.class).build(); ReadSheet sheet2 = EasyExcel.readSheet(1).head(SheetData.class).build(); try (var reader = readerBuilder.build()) { var listener1 = new SheetListener(); var listener2 = new SheetListener(); reader.read(sheet1, listener1); reader.read(sheet2, listener2); result.add(listener1.getDataList()); result.add(listener2.getDataList()); } catch (Exception e) { throw new RuntimeException(e.getMessage(), e); } return result; } } ``` 以上代码实现了针对不同Sheet的独立处理流程,并最终返回各Sheet的结果集合[^1]。 --- #### 5. 配置文件(可选) 如果项目中有Spring Boot环境,则可以通过`application.yml`简化一些参数配置过程: ```yaml spring: profiles: active: dev ``` 更细节参见参考资料。 --- ### 总结 综上所述,借助于阿里巴巴开源工具——EasyExcel框架能够轻松应对复杂的Excel操作需求,特别是对于涉及Sheet的情况,只需合理规划好各个模块之间的协作即可高效达成目标[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值