JAVA读取excel文件_记easyexcel的使用

本文介绍了如何使用easyExcel库来读取Excel文件,通过创建监听器和实体类,简单几步即可实现高效便捷的读取操作。监听器的invoke方法会在读取每一行时被调用,doAfterAllAnalysed方法则在读取完成后执行。示例代码展示了具体的实现过程,证明easyExcel的易用性和实用性。

之前有同学来问Excel的读取导出,那会还不知道easyExcel这玩意.只是自己封装了POI的API整了个工具类.今天试了下easyExcel人门 demo,发现easyExcel不错,在此总结一下.pom依赖:

一,Excel文件读取:

<dependency>

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

    1,自己实现一个读取的监听器,实现抽象类AnalysisEventListener<T>,监听器不使用spring管理,而是每次new对象.

        a,监听器的invoke()方法每读取一行会调用一次;

        b,监听器的doAfterAllAnalysed()读取完后会调用,仅仅一次.

    2,一个实体类:与excel表每一列对应的实体类.

    监听器代码:(确保指定的文件有demo.xlsx文件)

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.util.ArrayList;
import java.util.List;

// 有个
### Java 多线程使用 EasyExcel 读取 Excel 文件 #### 创建多线程环境 为了实现多线程处理,在Java中通常会创建一个`ExecutorService`池来管理线程。这可以通过调用`Executors.newFixedThreadPool(int nThreads)`方法完成,其中参数指定了线程的数量。 ```java // 定义线程数量 int threadCount = Runtime.getRuntime().availableProcessors(); ExecutorService executorService = Executors.newFixedThreadPool(threadCount); ``` #### 准备监听器类 对于每一个要被并行处理的工作表(Sheet),都需要实例化一个新的监听器对象。该监听器继承自`AnalysisEventListener<T>`泛型类,并重写了其内部的方法用于数据解析逻辑[^2]。 ```java public class SheetDataListener extends AnalysisEventListener<Map<Integer, String>> { private final BlockingQueue<List<String[]>> queue; public SheetDataListener(BlockingQueue<List<String[]>> queue) { this.queue = queue; } @Override public void invoke(Map<Integer, String> data, AnalysisContext context) { List<String[]> rowList = new ArrayList<>(); data.forEach((key, value) -> rowList.add(new String[]{String.valueOf(key), value})); try { queue.put(rowList); // 将每一行的数据放入队列中等待消费 } catch (InterruptedException e) { Thread.currentThread().interrupt(); // 设置中断标志位以便后续恢复状态 } } @Override public void doAfterAllAnalysed(AnalysisContext context) {} } ``` #### 实现并发读取功能 通过遍历所有的Sheet并将它们分配给不同的线程执行。这里利用了`EasyExcel.read()`静态工厂方法配合之前定义好的监听器来进行实际操作[^1]。 ```java public static void readMultiThread(MultipartFile file) throws IOException { InputStream inputStream = file.getInputStream(); // 获取所有工作簿中的 sheet 名称列表 List<Sheet> sheets = EasyExcel.read(inputStream).excelType(ExcelTypeEnum.XLSX).sheet().doReadAllSync(); // 阻塞队列用来存储各个线程解析出来的数据片段 BlockingQueue<List<String[]>> blockingQueue = new LinkedBlockingDeque<>(); ExecutorService executorService = null; try { int availableProcessors = Runtime.getRuntime().availableProcessors(); executorService = Executors.newFixedThreadPool(availableProcessors); for (Sheet sheet : sheets) { Future<?> future = executorService.submit(() -> { EasyExcel.read(inputStream, new SheetDataListener(blockingQueue)) .sheet(sheet.getSheetNo()) .doRead(); }); } // 关闭线程池 executorService.shutdown(); while (!executorService.awaitTermination(60, TimeUnit.SECONDS)) {} // 这里可以根据业务需求进一步处理blockingQueue里的数据... } finally { if (inputStream != null) { inputStream.close(); } if (null != executorService && !executorService.isShutdown()) { executorService.shutdownNow(); } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值