首页 > 其他分享 >EasyExcel简单使用教程(大量数据分批入库;非固定Excel解析)

EasyExcel简单使用教程(大量数据分批入库;非固定Excel解析)

时间:2024-07-05 10:59:57浏览次数:23  
标签:RuleExcel 实体类 list EasyExcel Excel 解析 数据 入库

前言

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

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

实现Excel模板内容对应的实体类

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;
}

  

实现AnalysisEventListener监听类

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

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

    /**
     * 默认每隔500条存储数据库
     */
    private int batchCount = 500;
    /**
     * 缓存的数据列表
     */
    private List<RuleExcel> list = new ArrayList<>();
    /**
     * 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<Map<Integer, String>> resultList = EasyExcelUtil.getEasyExcelReaderBuilder(file.getInputStream, null, null)
											.headRowNumber(0).doReadAllSync();
// resultList 中存储的就是自0行开始解析到的所有数据

  原文地址   https://blog.csdn.net/Ka__ze/article/details/131811311

标签:RuleExcel,实体类,list,EasyExcel,Excel,解析,数据,入库
From: https://www.cnblogs.com/xianz666/p/18285365

相关文章

  • java分批读取excel中数据处理
     java分批读取excel中数据处理在Java中,可以使用ApachePOI库来读取和处理Excel数据。以下是一个简单的例子,展示了如何分批次读取Excel文件中的数据。importorg.apache.poi.ss.usermodel.*;importorg.apache.poi.xssf.usermodel.XSSFWorkbook;importjava......
  • 使用EasyExcel的AnalysisEventListener读取EXCEL导入数据
    1、实体对象VOimportcom.alibaba.excel.annotation.ExcelProperty;importlombok.Data;@DatapublicclassPrizeLogImportExcelVO{@ExcelProperty("订单编号")privateStringprizeSn;@ExcelProperty("快递公司")privateStringexpressN......
  • 艾宾浩斯遗忘曲线复习计划表Excel下载
    艾宾浩斯遗忘曲线复习计划表Excel下载 改造自贵乎大神的Excel:艾宾浩斯遗忘曲线怎么用?链接:https://pan.baidu.com/s/1rqQLOPXAxTxDs_Tk9fIN5A提取码:u53x如果失效了,记得提醒我 日期:是从今天2020/11/02计划到2025/05/26用法:不要修改或删除任何日期(任何一行都不要删除掉......
  • 树形结构导出excel表格
    树形结构导出excel表格原本是想做成这样但是没学会,最后做成这样直接看代码publicStringexcelDowmload(DormCheckStatParamDtoparam){StringresultUrl=null;param.setSearchAll(SEARCH_ALL_NO);try{DormCheckResult......
  • 06-Excel初阶操作-学习笔记
    SUMIF和SUMIFS单(多)条件求和函数函数格式参数说明SUMTIF(参数1,参数2,参数3)参数1:区域参数2:符合条件参数3:求和区域SUMIFS(参数1,参数2,参数3,参数4,……)参数1:求和区域参数2:区域参数3:符合条件参数4:区域……基础应用SUMTIF(参数1,参数2,参数3)......
  • 钉钉应用开发-Python操作钉钉文档(excel版)
    钉钉应用开发-Python操作钉钉文档一:服务端SDK下载服务端SDK下载-钉钉开放平台(dingtalk.com)pip3installalibabacloud_dingtalk二:钉钉开放平台开发者后台(dingtalk.com)基础概念-钉钉开放平台(dingtalk.com)2.1:创建应用2.2:获取应用基本信息2.3:权限申请,获取......
  • EXCEL中20个数据处理类函数公式应用实例
    在Excel中,数据处理类函数是进行数据分析和报告制作的重要工具。以下列举了另外20个数据处理类函数及其应用实例,这些函数涵盖了一系列高级的数据处理需求,包括统计分析、财务计算、工程计算以及更复杂的文本和日期时间操作。数据统计与分析STDEV.S函数:用于计算样本标准差。例......
  • excel基本操作
    1.设置保护/锁定工作表和工作薄设置保护表:打开excel--->打开审阅--->点击允许编辑区域  其他区域不能进行输入 设置保护工作薄:sheet1 sheet2就是工作薄2.填充柄:鼠标左键下拉 3.利用自定义列表填充  文件-》选项-》高级-》编辑自定义列表4.填充柄:鼠标右键下拉......
  • 像学Excel 一样学 Pandas系列-创建数据分析维度
    嗨,小伙伴们。又到喜闻乐见的Python数据分析王牌库Pandas的学习时间。按照数据分析处理过程,这次轮到了新增维度的部分了。老样子,我们先来回忆一下,一个完整数据分析的过程,包含哪些部分内容。其中,Pandas的基础信息导入、数据导入和数据整理、数据探索和清洗已经在前几篇文章......
  • 学习笔记485—Excel技巧:一键将文本数字转换为数值
    Excel技巧:一键将文本数字转换为数值在使用Excel进行数据处理时,经常会遇到数据格式不匹配的问题。特别是当从外部导入数据或手动输入数据时,数字可能会被误识别为文本格式,这在进行数据计算和分析时会带来诸多不便。幸运的是,Excel提供了一些便捷的方法,可以帮助我们一键将文本转换为......