首页 > 其他分享 >EasyExcel读取合并单元格数据

EasyExcel读取合并单元格数据

时间:2024-10-09 15:50:16浏览次数:11  
标签:读取 extra EasyExcel 单元格 E6% headNumber import

EasyExcel

EasyExcel 文档地址:https://easyexcel.opensource.alibaba.com/docs/current/quickstart/read

一、前言

当 excel 表格的数据表头和内容都比较工整,每个单元格对应一个数据时,通过 EasyExcel 可以很容易就将数据读取出来。但是当表格数据存在合并单元格时,还是按照 EasyExcel 原来的方式读取数据,读取出来的数据只有合并单元格的首行才有数据,其他行的数据均为null

二、问题分析

首先需要知道 excel表格合并单元格的原理:在合并单元格时,仅保留左上角的值,而放弃其他值

也就是说合并的单元格取的值都是左上角的值

三、实现

EasyExcel 处理合并单元格文档地址:

https://easyexcel.opensource.alibaba.com/docs/current/quickstart/read#%E9%A2%9D%E5%A4%96%E4%BF%A1%E6%81%AF%E6%89%B9%E6%B3%A8%E8%B6%85%E9%93%BE%E6%8E%A5%E5%90%88%E5%B9%B6%E5%8D%95%E5%85%83%E6%A0%BC%E4%BF%A1%E6%81%AF%E8%AF%BB%E5%8F%96

监听器

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.metadata.CellExtra;
import com.alibaba.excel.read.listener.ReadListener;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;

/**
 * Excel 监听器
 * Created by fengxuguang on 2024/5/23 9:41
 */
@Getter
@Slf4j
public class ExcelListener<T> implements ReadListener<T> {

    private final List<T> list = new ArrayList<>();

    private Integer headNumber = 0;

    private final List<CellExtra> extraMergeList = new ArrayList<>();

    public ExcelListener(Integer headNumber) {
        this.headNumber = headNumber;
    }

    @Override
    public void invoke(T data, AnalysisContext analysisContext) {
        if (analysisContext.readRowHolder().getRowIndex() >= headNumber) {
            list.add(data);
        }
    }

    @Override
    public void extra(CellExtra extra, AnalysisContext context) {
        switch (extra.getType()) {
            case COMMENT:
                log.info("解析到一条注释:{}", extra.toString());
                break;
            case HYPERLINK:
                log.info("解析到一条链接:{}", extra.toString());
                break;
            case MERGE:
//                log.info(
//                        "额外信息是超链接,而且覆盖了一个区间,在firstRowIndex:{},firstColumnIndex;{},lastRowIndex:{},lastColumnIndex:{}",
//                        extra.getFirstRowIndex(), extra.getFirstColumnIndex(), extra.getLastRowIndex(),
//                        extra.getLastColumnIndex());
                if (extra.getRowIndex() >= headNumber) {
                    extraMergeList.add(extra);
                }
                break;
            default:
                break;
        }
        ReadListener.super.extra(extra, context);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }
}

在读取文件的时候添加 .extraRead(CellExtraTypeEnum.MERGE)就能获取所有的合并单元格,代码如下:

ExcelListener<T> readListener = new ExcelListener<T>(headRowNumber);
EasyExcel.read(inputStream, clazz, readListener)
        // 需要读取合并单元格信息 默认不读取
        .extraRead(CellExtraTypeEnum.MERGE)
        .sheet(sheetIndex)
        .doRead();

EasyExcel中可以通过 @ExcelProperty中的index属性来标明该字段的索引,例如:

@ExcelProperty(value = "名称", index = 2)
private String name;

标签:读取,extra,EasyExcel,单元格,E6%,headNumber,import
From: https://www.cnblogs.com/fxg23/p/18454451

相关文章

  • java 按行读取文件,并筛选包含指定字符行数据
    `importjava.io.BufferedReader;importjava.io.FileNotFoundException;importjava.io.FileReader;importjava.util.Collections;importjava.util.List;importjava.util.stream.Collectors;publicclassTestController{publicstaticvoidmain(String[]......
  • 使用apatch httpClient, 并且我用了try-with-resource, 我希望在catch 和 finally 中从
    在使用ApacheHttpClient时,如果你使用了try-with-resources语法并希望在catch或finally块中从response对象中读取完整的responseentity,你可能会遇到资源过早关闭的问题。这是因为try-with-resources会在try块结束后自动关闭资源,导致在catch或finally块中无法......
  • 从数据库中读取的数据显示到控制台乱码
    设置数据库连接池的字符编码与数据库的字符编码一致我的是utf8mb4//设置字符集为utf8mb4,以确保结果编码正确con->setClientOption("characterSetResults",(void)"utf8mb4");con->setClientOption("characterSetClient",(void)"utf8mb4");con->setClientOpti......
  • Python 高级编程:深入解析 CSV 文件读取
    在Python中,读取CSV(逗号分隔值)文件是数据处理中的常见任务。以下将介绍一些高级的方法来读取CSV文件:使用pandas库读取CSV文件importpandasaspddf=pd.read_csv('file.csv')print(df)pandas是一个强大的数据处理库,read_csv函数可以方便地读取CSV文件并将其转换......
  • table 单元格合并
    table元素合并单元格,用法倒是很简单,但过程中遇到了点小问题,记录下:1、多行多列合并,使用 rowSpan、colSpan设置要合并的行列数,再将合并后的多余单元格删除即可:functionmerge(table,px,py,row,col,remove=true){py--;lettarget=table.rows[px].......
  • 使用openpyxl读取Excel设置了公式的单元格 默认读取的是公式而不是公式结果
    使用openpyxl对单元格有公式的Excel的sheet进行操作,如果又读又写,可以采用双重读取方式解决。在Excel中,如果单元格的值是通过公式计算的,而你通过openpyxl库读取时发现获取的是公式而非结果,原因是openpyxl默认只读取单元格的公式而不计算公式的结果。为了获取公式计算后的......
  • Python 高级编程:高效读取 txt 文件的技巧与实践
    在Python中,读取txt文件是一项常见的操作。以下将介绍一些高级的方法来实现这一功能:使用with语句自动管理文件资源withopen('file.txt','r')asfile:content=file.read()print(content)with语句可以确保在代码块执行完毕后,文件会被正确地关闭,避免了资源泄漏......
  • Python 高级技巧:深入解析读取 Excel 文件的多种方法
    一、引言 在数据分析和处理中,经常需要从Excel文件中读取数据。Python提供了多种库来实现这个功能,本文将深入探讨使用 ​​pandas​​、​​openpyxl​​ 和 ​​xlrd​​ 库读取Excel文件的高级技巧和代码实现。 二、使用pandas库读取Excel文件 ​​pandas......
  • Pandas DataFrame对象df 读取数据
    你的df是一个PandasDataFrame对象,类似于一个表格结构的数据,通常有行和列。根据你的描述,表格中有多列数据,例如TS_CODE,DATE,TIME,OPEN等,总共有33列。要显示df中某个特定项目的值,例如“股票的当前价格”,你可以按照以下方式来操作。假设df里有一列CURRENT_PRICE表......
  • 讯飞星火编排创建智能体学习(四):网页读取
    目录引言网页读取节点如何生成网址测试引言在讯飞星火编排创建智能体学习(三):搜索工具-CSDN博客中,我介绍了如何用搜索工具从网上搜索车次信息。不过,在测试中我们也发现讯飞星火的这个工具并不是特别完善,它在整理搜索结果时可能会出现错误。所以,如果你确定某个网站可以获......