EaxyExcel读取多个sheet的数据

前言

EaxyExcel不仅导出多个sheet页,还可以读取多个sheet。核心是为每个sheet分别配置监听器。

效果

在这里插入图片描述

在这里插入图片描述

实现

导入依赖

		<!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.7</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>30.1-jre</version>
        </dependency>
        
		<!-- Lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        
		 <!-- springboot test启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

继承AnalysisEventListener类

EaxyExcel读取excel采用监听者模式,监听器的命名以Listener结尾。要实现的是invoke和doAfterAllAnalysed方法。

EaxyExcel每读一行数据都调用invoke方法,读完当前sheet后调用doAfterAllAnalysed。

AnalysisEventListener是个泛型类,假设传入的泛型是Map<Integer, String>,那就取到每个格子的列号和值,再配合invoke的参数,可以拿到行号。列号和行号都有了,干啥不行?

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.util.*;

/**
 * 不能交给spring管理,每次读取都要new
 *
 * @date 12/23/2020 18:52
 */
@Slf4j
@Data
public class LunchDataListenerMultiSheetForCSDN extends AnalysisEventListener<Map<Integer, String>> {

    private List<List<String>> dataList;

    public LunchDataListenerMultiSheetForCSDN() {
        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);
        // 把数据放到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("数据读取完成");
    }
}

单元测试

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.read.metadata.ReadSheet;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import java.util.ArrayList;

/**
 * https://www.cjavapy.com/mip/486/
 * Java 使用EasyExcel读取Excel中多个sheet方法及示例代码
 * <p>
 * csdn
 *
 * @date 01/22/2021 04:06
 */
@Slf4j
public class ReadDemo3MultiSheetForCSDN {

    /**
     * 读取多个sheet
     */
    @Test
    public void test1() {
        // 读取已经填好的模板
        String fileName = "/Users/quanlinglong/Downloads/mergeDemo/demo1611758627138.xlsx";
        // 读取带下拉框的表格
        System.out.println("fileName = " + fileName);

        ExcelReader excelReader =
                EasyExcel.read(fileName).build();

        // 每个sheet分别创建监听器
        LunchDataListenerMultiSheetForCSDN listener0 = new LunchDataListenerMultiSheetForCSDN();
        LunchDataListenerMultiSheetForCSDN listener1 = new LunchDataListenerMultiSheetForCSDN();

        ReadSheet readSheet0 =
                EasyExcel.readSheet(0).registerReadListener(listener0).build();

        ReadSheet readSheet1 =
                EasyExcel.readSheet(1).registerReadListener(listener1).build();

        // 这里注意 一定要把sheet1 sheet2 一起传进去,不然有个问题就是03版的excel 会读取多次,浪费性能
        // 可以传多个ReadSheet对象,读多个sheet
        excelReader.read(readSheet0, readSheet1);

        // 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
        excelReader.finish();
        // 程序执行到这里,excel 已经读完了,下面是处理数据

		// 示范一个读数据的方式,非重点,你可以用自己的方式
        ArrayList<LunchDataListenerMultiSheetForCSDN> listenerList = new ArrayList<>();
        listenerList.add(listener0);
        listenerList.add(listener1);
        for (LunchDataListenerMultiSheetForCSDN listener : listenerList) {
            // 从listtener中取出内容
            listener.getDataList().forEach(lineData -> {
                System.out.println("lineData = " + lineData);
                // 其它业务处理。。
            });
        }

    }
}

拿到当前sheet的数据要在哪里处理呢?在invoke方法里逐行处理,也可以读完后用doAfterAllAnalysed处理,本文用后一种思路。具体在哪里处理,结合你的业务需求灵活处理。

相关链接:
Java 使用EasyExcel读取Excel中多个sheet方法及示例代码

希望对你有帮助

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: 在Python中,可以使用pandas库来读取Excel文件中的多个sheet数据。首先,需要安装pandas库,可以使用`pip install pandas`命令进行安装。 接下来,需要使用`pandas`的`read_excel()`函数来读取Excel文件。这个函数可以接受一个参数`sheet_name`,用于指定要读取sheet名称或索引。 例如,如果Excel文件中有两个sheet分别为"Sheet1"和"Sheet2",可以通过以下代码读取它们的数据: ```python import pandas as pd # 读取Excel文件 data = pd.read_excel('filename.xlsx', sheet_name=['Sheet1', 'Sheet2']) # 获取第一个sheet数据 sheet1_data = data['Sheet1'] # 获取第二个sheet数据 sheet2_data = data['Sheet2'] ``` 在以上代码中,`filename.xlsx`是要读取Excel文件的路径。通过`sheet_name`参数指定了要读取sheet名称,使用了一个字典的方式将sheet名称和对应的数据存储在`data`变量中。 通过`data`变量,可以通过索引的方式获取到每个sheet数据,存储在不同的变量中,如`sheet1_data`和`sheet2_data`。 除了使用字典的方式读取多个sheet外,还可以使用其他的方式,如读取所有的sheet数据或者读取指定索引的sheet数据。详细的用法可以参考`pandas`官方文档。 这样就可以通过pandas库实现在Python中读取Excel文件中的多个sheet数据了。 ### 回答2: 在Python中,如果想要使用pandas库读取Excel文件中的多个sheet数据,可以按照以下步骤进行操作。 首先,需要安装pandas库。可以使用pip命令进行安装:pip install pandas 接下来,导入pandas库和openpyxl库(用于支持Excel文件的读写操作): import pandas as pd import openpyxl 然后,利用pandas的read_excel函数读取整个Excel文件: excel_file = pd.ExcelFile('文件路径/文件名.xlsx') 读取整个Excel文件的所有sheet名称: sheet_names = excel_file.sheet_names 遍历所有的sheet名称,读取每个sheet数据并存储到字典中: data_dict = {} for sheet_name in sheet_names: data_dict[sheet_name] = excel_file.parse(sheet_name) 最后,可以通过data_dict字典访问到每个sheet数据: for sheet_name, data in data_dict.items(): print("Sheet名称:", sheet_name) print("Sheet数据:", data) 注意事项: 1. 需要确定Excel文件的路径和文件名,并将其替换到代码中的'文件路径/文件名.xlsx'部分。 2. 需要确保Excel文件支持.xlsx格式,否则可能需要使用不同的库或方法进行读取。 3. 如果Excel文件中的数据包含特殊格式或公式,需要进行额外的处理或转换。 ### 回答3: Python中的pandas库提供了一种方便的方法来读取Excel文件中的多个sheet数据。要读取多个sheet数据,我们需要使用pandas的ExcelFile函数来打开Excel文件,然后使用parse方法来读取每个sheet数据。 首先,我们需要安装pandas库。在命令行中运行以下命令进行安装: pip install pandas 接下来,我们可以使用以下代码来读取多个sheet数据: import pandas as pd # 使用ExcelFile函数打开Excel文件 excel_file = pd.ExcelFile('filename.xlsx') # 获取所有sheet的名称 sheet_names = excel_file.sheet_names # 创建一个空的字典来存储每个sheet数据 data = {} # 遍历每个sheet的名称 for sheet_name in sheet_names: # 使用parse方法读取每个sheet数据 data[sheet_name] = excel_file.parse(sheet_name) # 打印每个sheet数据 for sheet_name, sheet_data in data.items(): print(f"Sheet '{sheet_name}':") print(sheet_data) 上述代码中,我们首先使用ExcelFile函数打开Excel文件,并使用sheet_names属性获取所有sheet的名称。然后,我们创建一个空的字典来存储每个sheet数据。 接下来,我们使用for循环遍历每个sheet的名称,并使用parse方法读取每个sheet数据。将每个sheet的名称作为字典的键,将每个sheet数据作为字典的值存储起来。 最后,我们使用for循环打印每个sheet数据。这样,我们就可以读取并打印出Excel文件中的多个sheet数据。 以上是使用Python的pandas库来读取Excel文件中多个sheet数据的方法。希望对你有所帮助!
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值