使用EasyExcel将excel中多sheet导入,简单方便

首先导入easyExcel依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.3.2</version>
</dependency>

service层实现类的方法

    @Override
    public String importUser(MultipartFile file) {

        try (InputStream inputStream = file.getInputStream()) {
            // 创建临时文件
            File tempFile = createTempFile(file);
            // 读取Excel数据
            List<LunchDataMultiSheetListener> listenerList = readExcelData(tempFile);

            // 处理Excel数据
            handleExcelData(listenerList);
            return "success";
        } catch (IOException e) {
            e.printStackTrace();
            return "error";
        }
    }

    /**
     * 创建临时文件
     */
    private File createTempFile(MultipartFile file) throws IOException {
        String originalFilename = file.getOriginalFilename();
        String[] filename = originalFilename.split("\\.");
        File tempFile = File.createTempFile(filename[0], "." + filename[1] + ".");
        file.transferTo(tempFile);
        tempFile.deleteOnExit();
        return tempFile;
    }

    /**
     * 读取Excel数据
     */
    private List<LunchDataMultiSheetListener> readExcelData(File file) {
        ExcelReader excelReader = EasyExcel.read(file).build();
        List<ReadSheet> sheets = excelReader.excelExecutor().sheetList();
        List<LunchDataMultiSheetListener> listenerList = sheets.stream()
                .map(sheet -> {
                    LunchDataMultiSheetListener listener = new LunchDataMultiSheetListener();
                    ReadSheet readSheet = EasyExcel.readSheet(sheet.getSheetNo()).registerReadListener(listener).build();
                    excelReader.read(readSheet);
                    List<List<String>> dataList = listener.getDataList();
                    return listener;
                })
                .collect(Collectors.toList());
        excelReader.finish();
        return listenerList;
    }


    private void handleExcelData(List<LunchDataMultiSheetListener> listenerList, Long projectId) {
        listenerList.forEach(listener -> listener.getDataList().forEach(lineData -> {
            System.out.println("lineData = " + lineData);
          // 其它业务处理。。
                  }));

        });

    }

}

重点来了,那就是easyexcel要使用的监听器


@Slf4j
@Data
public class LunchDataMultiSheetListener extends AnalysisEventListener<Map<Integer, String>> {

    private List<List<String>> dataList;
    public LunchDataMultiSheetListener() {
        this.dataList = new ArrayList<>();
    }

    /**
     * 每读到一行数据都调用invoke方法
     *
     * @param integerObjectMap
     * @param context
     */
    @Override
    public void invoke(Map<Integer, String> integerObjectMap, AnalysisContext context) {
        Integer rowIndex = context.readRowHolder().getRowIndex();
        System.out.println("rowIndex = " + rowIndex);
       // key为列号,value为单元格的内容
        log.info("解析到数据:{}", integerObjectMap);


        // 获取当前解析的sheet的信息
        String sheetName = context.readSheetHolder().getSheetName();
//        Integer sheetIndex = context.readSheetHolder().getSheetNo();
//        System.out.println("当前解析的sheet名称:" + sheetName);
//        System.out.println("当前解析的sheet索引:" + sheetIndex);


        // 把数据放到dataList里面,便于统一处理
        LinkedList<String> strings = new LinkedList<>();
        integerObjectMap.forEach((k, v) -> {
            strings.add(v);
        });
        this.dataList.add(strings);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        // 读完所有数据,做统一处理。
        // 当然还可以拿到listener之外处理

        log.info("数据读取完成");
    }

}

核心完成了
你可以根据监听器中的map分别处理每一个sheet中的数据

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值