使用EasyExcel实现简单的Excel表格解析操作

2025-03-18 01:50

本文主要是介绍使用EasyExcel实现简单的Excel表格解析操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《使用EasyExcel实现简单的Excel表格解析操作》:本文主要介绍如何使用EasyExcel完成简单的表格解析操作,同时实现了大量数据情况下数据的分次批量入库,并记录每条数据入库的状态,感兴...

前言

本文记录了如何使用EasyExcel完成简单的表格解析操作,同时实现了大量数据情况下数据的分次批量入库,并记录每条数据入库的状态,以便进行结果统计。

固定模板及表数据格式的解析

实现Excehttp://www.chinasem.cnl模板内容对应的实体类

import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import lombok.Data;
import Java.io.Serializable;

@Data
@ColumnWidth(24)
@HeadRowHeight(20)
@ContentRowHeight(18)
public class RuleExcel implements Serializable {

    private static final long serialVersionUID = 1L;

    // 被该注解修饰的实体类中的属性值,会作为excel对应的标题头文字
    @ExcelProperty(value = "规则名称")
    private String name;
    
    // 被该注解修饰的实体类中的属性,会在excel与实体类的转换中被忽略
    // 该变量用于标记该条实体类是否成功入库,在入库后操作后更新值为true
    @ExcelIgnore
    private boolean isSuccess;
}

实现ApythonnalysisEventListener监听类

为需要读取的Excel新建一个监听类,用于专门处理该类型数据的Excel,数据库的解析逻辑主要都放在这里边。

@Data
@RequiredArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class RuleExcelImportListener extends AnphpalysisEventListener<RuleExcel> {

    /**
     * 默认每隔500条存储数据库
     */
    private int BATchCount = 500;
    /**
     * 缓存的数据列表
     */
    private List<RuleExcel> list = new ArrayLijavascriptst<>();
    /**
     * service
     */
    private final IRuleExcelService RuleExcelService;
	
	// 解析表头
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        List<String> titleList = new ArrayList<>();
        try {
	        // 获取必要表头列数据
        	// 获取目标属性上@ExcelProperty的值,即属性的中文名称
            String[] nameValue = AnnotationUtil.getAnnotationValue(RuleExcel.class.getDeclaredField("name"), ExcelProperty.class);
            titleList.add(nameValue[0]);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        // 检测获取到的Excel标题头是否合法
        for (String title : titleList) {
            boolean isExist = false;
            for (Integer i : headMap.keySet()) {
                if (title.equals(headMap.get(i))) {
                    isExist = true;
                }
            }
            if (!isExist) {
                throw new ExcelAnalysisException("模版标题不允许修改");
            }
        }
    }


	// 解析表格内容,一行就是一个RuleExcel实体类
    @Override
    public void invoke(RuleExcel RuleExcel, AnalysisContext analysisContext) {
	    // 数据合法性校验
        if (String.isEmpty(RuleExcel.getName()) {
            throw new ExcelAnalysisException("导入失败,必填项按要求填写");
        }
       
        list.add(RuleExcel);
        // 数据入库2:
        // 如果表格数据量很大,可以设定暂存数据量阈值,当现存list数量超过阈值后,会先向数据库中存入一批数据、清空内存后再继续解析
        // 达到BATCH_COUNT,则调用importer方法入库,防止数据几万条数据在内存,容易OOM
        if (list.size() >= batchCount) {
            // 调用importer方法
            RuleExcelService.importRuleExcel(list);
            // 存储完成清理list
            list.clear();
        }
    }

	// 将所有的表格行数据解析完毕后会执行该方法
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    	// 数据入库1:
    	// 一般来说,如果确定表格数据量不大,那么可以在解析完全部excel数据后进行数据入库操作
        RuleExcelService.importRuleExcel(list);
        // 存储完成清理list
        list.clear();
    }
}

调用方法示例

public void importRuleExcel(MultipartFile file) {
		// 文件后缀检查
		CommonUtil.checkImportFile(file.getOriginalFilename());
		InputStream inputStream;
		// 存储表格解析结果
		List<RuleExcel> ruleExcels = new ArrayList<>();
		try {
			// 将Service层变量作为依赖传入
			RuleImportListener importListener = new RuleImportListener(ruleService);
			inputStream = new BufferedInputStream(file.getInputStream());
			// EasyExcel.read()传入:InputStream, 表格数据实体类,表格数据实体类监听器
			ExcelReaderBuilder builder = EasyExcel.read(inputStream, RuleExcel.class, importListener);
			// 执行同步解析操作并返回解析结果
			ruleExcels = builder.doReadAllSync();
		} catch (Exception e) {
			throw new ServiceException(e.getMessage());
		}
		// 导入成功的列表
		List<RuleExcel> successList = ruleExcels .stream().filter(RuleExcel::isSuccess).collect(Collectors.toList());
	}

非固定模板及非固定表数据格式的解析

有时候需要读取的模板并不是固定的、实现声明好的列,对应的数据也不能解析成某个固定的实体类,这个时候就需要我们读取表的原始解析数据,并自行进行后续操作。

// EasyExcel.read()传入:InputStream, 表格数据实体类,表格数据实体类监听器
// headRowNumber()传入:表头行的所在行数
List&l编程t;Map<Integer, String>> resultList = EasyExcelUtil.getEasyExcelReaderBuilder(file.getInputStream, null, null)
											.headRowNumber(0).doReadAllSync();
// resultList 中存储的就是自0行开始解析到的所有数据

到此这篇关于使用EasyExcel实现简单的Excel表格解析操作的文章就介绍到这了,更多相关EasyExcel解析Excel表格内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于使用EasyExcel实现简单的Excel表格解析操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153801

相关文章

Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)

《Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)》:本文主要介绍Java导入、导出excel的相关资料,讲解了使用Java和ApachePOI库将数据导出为Excel文件,包括... 目录前言一、引入Apache POI依赖二、用法&步骤2.1 创建Excel的元素2.3 样式和字体2.

Java实现将Markdown转换为纯文本

《Java实现将Markdown转换为纯文本》这篇文章主要为大家详细介绍了两种在Java中实现Markdown转纯文本的主流方法,文中的示例代码讲解详细,大家可以根据需求选择适合的方案... 目录方法一:使用正则表达式(轻量级方案)方法二:使用 Flexmark-Java 库(专业方案)1. 添加依赖(Ma

使用国内镜像源优化pip install下载的方法步骤

《使用国内镜像源优化pipinstall下载的方法步骤》在Python开发中,pip是一个不可或缺的工具,用于安装和管理Python包,然而,由于默认的PyPI服务器位于国外,国内用户在安装依赖时可... 目录引言1. 为什么需要国内镜像源?2. 常用的国内镜像源3. 临时使用国内镜像源4. 永久配置国内镜

Mybatis从3.4.0版本到3.5.7版本的迭代方法实现

《Mybatis从3.4.0版本到3.5.7版本的迭代方法实现》本文主要介绍了Mybatis从3.4.0版本到3.5.7版本的迭代方法实现,包括主要的功能增强、不兼容的更改和修复的错误,具有一定的参考... 目录一、3.4.01、主要的功能增强2、selectCursor example3、不兼容的更改二、

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超

如何使用C#串口通讯实现数据的发送和接收

《如何使用C#串口通讯实现数据的发送和接收》本文详细介绍了如何使用C#实现基于串口通讯的数据发送和接收,通过SerialPort类,我们可以轻松实现串口通讯,并结合事件机制实现数据的传递和处理,感兴趣... 目录1. 概述2. 关键技术点2.1 SerialPort类2.2 异步接收数据2.3 数据解析2.

详解如何使用Python提取视频文件中的音频

《详解如何使用Python提取视频文件中的音频》在多媒体处理中,有时我们需要从视频文件中提取音频,本文为大家整理了几种使用Python编程语言提取视频文件中的音频的方法,大家可以根据需要进行选择... 目录引言代码部分方法扩展引言在多媒体处理中,有时我们需要从视频文件中提取音频,以便进一步处理或分析。本文

mybatis-plus 实现查询表名动态修改的示例代码

《mybatis-plus实现查询表名动态修改的示例代码》通过MyBatis-Plus实现表名的动态替换,根据配置或入参选择不同的表,本文主要介绍了mybatis-plus实现查询表名动态修改的示... 目录实现数据库初始化依赖包配置读取类设置 myBATis-plus 插件测试通过 mybatis-plu

python多种数据类型输出为Excel文件

《python多种数据类型输出为Excel文件》本文主要介绍了将Python中的列表、元组、字典和集合等数据类型输出到Excel文件中,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一.列表List二.字典dict三.集合set四.元组tuplepython中的列表、元组、字典

使用Dify访问mysql数据库详细代码示例

《使用Dify访问mysql数据库详细代码示例》:本文主要介绍使用Dify访问mysql数据库的相关资料,并详细讲解了如何在本地搭建数据库访问服务,使用ngrok暴露到公网,并创建知识库、数据库访... 1、在本地搭建数据库访问的服务,并使用ngrok暴露到公网。#sql_tools.pyfrom