easyexcel读取excel将数据存到mysql【一个简单的例子】

news2025/2/4 20:41:43

读取excel

1 xml里面增加maven

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

2 读取excel用到的实体

自行更改字段

package com.hahaha.dto;

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@EqualsAndHashCode
public class ReadExcelDto {

    /**
     * 账期
     * 用名字去匹配,这里需要注意,如果名字重复,会导致只有一个字段读取到数据
     */
    @ExcelProperty("账期")
    private String month;

	/**
     * 强制读取第三列 这里不建议 index 和 name 同时用,要么一个对象只用index,要么一个对象只用name去匹配
     */
    @ExcelProperty(index = 2)
    private Double doubleData;
   
    /**
     * 姓名
     */
    @ExcelProperty(value = "姓名")
    private String name;
}

3 读取excel用到的监听器

package com.hahaha.util.easyexcel;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import com.hahaha.service.CommonExcelReadService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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

/**
 * 公共的excel读取监听器
 * @param <T> 实体范型
 */
public class CommonReadListener<T> extends AnalysisEventListener<T> {
    private static final Logger LOGGER = LoggerFactory.getLogger(CommonReadListener.class);
    /**
     * 每隔1000条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
     */
    private static final int BATCH_COUNT = 1000;
    List<T> list = new ArrayList<>();
    /**
     * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
     */
    private CommonExcelReadService service;

    /**
     * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
     *
     * @param service 公共 service
     */
    public CommonReadListener(CommonExcelReadService service) {
        this.service = service;
    }

    /**
     * 这个每一条数据解析都会来调用
     *
     * @param data
     *            one row value. Is is same as {@link AnalysisContext#readRowHolder()}
     * @param context context
     */
    @Override
    public void invoke(T data, AnalysisContext context) {
        LOGGER.info("解析到一条数据:{}", JSON.toJSONString(data));
        list.add(data);
        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if (list.size() >= BATCH_COUNT) {
            saveData();
            // 存储完成清理 list
            list.clear();
        }
    }

    /**
     * 所有数据解析完成了 都会来调用
     *
     * @param context context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 这里也要保存数据,确保最后遗留的数据也存储到数据库
        saveData();
        LOGGER.info("所有数据解析完成!");
    }

    /**
     * 加上存储数据库
     */
    private void saveData() {
        LOGGER.info("{}条数据,开始存储数据库!", list.size());
        Integer num = service.saveBatchData(list);
        LOGGER.info("存储数据库成功数量为:{}", num);
    }
}

4 读取excel用到的公共service

package com.hahaha.service;

import java.util.List;

/**
 *
 * 公共的excel读取接口
 * 实现接口并重写saveBatchData方法即可保存自定义的业务数据
 */
public interface CommonExcelReadService {

    /**
     * 批量保存数据
     * @param list 要保存的数据
     * @param <T> 数据类型实体,可以根据具体的业务实体转换
     * @return Integer 保存成功的条数
     */
    public <T> Integer saveBatchData(List<T> list);
}

5 读取excel用到的公共方法

package com.hahaha.util.easyexcel;

import com.alibaba.excel.EasyExcel;
import com.hahaha.service.CommonExcelReadService;

import java.io.InputStream;

/**
 * excel工具类
 */
public class EasyExcelUtil {

    /**
     *
     * @param inputStream 文件流
     * @param clazz 读取excel的实体class
     * @param commonService 将数据存储到某张表的service【需要在业务service上实现这个接口,并重写saveBatchData方法】
     * @param <T> 泛型类型
     */
    public static <T> void readExcel(InputStream inputStream, Class<?> clazz, CommonExcelReadService commonService) {
        CommonReadListener readExcelDataListener = new CommonReadListener(commonService);

        EasyExcel.read(inputStream, clazz, readExcelDataListener)
                .sheet()
                .doRead();
    }
}

6 controller接口

package com.hahaha.controller;

import javax.annotation.Resource;
import com.hahaha.util.easyexcel.EasyExcelUtil;
import org.springframework.web.multipart.MultipartFile;

@RestController
public class MyController {

	@Resource
    private MyService myService;

	@PostMapping("upload")
    public 你的返回结构 upload(MultipartFile file) {
    	// 校验文件格式和大小的
        CommonMethod.uploadVerify(file);
        try {
        // todo ReadExcelDto是读取excel的dto,改成自己的;myService改成自己的
            EasyExcelUtil.readExcel(file.getInputStream(), ReadExcelDto.class, myService);
        } catch (IOException o){
            log.error(o.getMessage());
            返回错误信息
        }
        return 返回正确信息
    }
}

校验文件格式和大小看这个
https://blog.csdn.net/lh155136/article/details/126585728

7 业务service和serviceIml

我这个是有mybatisplus的,如果不需要可以去掉

package com.hahaha.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.hahaha.entity.MyEntity;
import com.hahaha.service.CommonExcelReadService;

// todo 这里非常重要,一定要实现CommonExcelReadService 
public interface MyService extends IService<MyEntity>, CommonExcelReadService {

}
package com.hahaha.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hahaha.dto.ReadExcelMIITDto;
import com.hahaha.entity.MyEntity;
import com.hahaha.mapper.MyMapper;
import com.hahaha.service.MyService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

@Service
public class MyServiceImpl extends ServiceImpl<MyMapper, MyEntity> implements MyService {

    @Resource
    private MyMapper myMapper;

    @Override
    public <T> Integer saveBatchData(List<T> list) {
        List<ReadExcelDto> entityList = JSONObject.parseArray(JSONObject.toJSONString(list),
                ReadExcelDto.class);

        return myMapper.saveBatchList(entityList);
    }
}

7 mapper和mapper.xml

我是手写了一个insertbatch方法,也可以用mybaits-plus的savebatch

package com.hahaha.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hahaha.dto.ReadExcelMIITDto;
import com.hahaha.entity.MyEntity;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface MyMapper extends BaseMapper<MyEntity> {

    int saveBatchList(List<ReadExcelDto> list);
}
	<insert id="saveBatchList">
        INSERT INTO 你的表名字 (
            month,
            name
        )
        VALUES
        <foreach collection="list" item="obj" separator=",">
            (
                #{obj.month},
                #{obj.name}
            )
        </foreach>
	</insert>

测试

在这里插入图片描述

在这里插入图片描述
其他难度的后面再更新,有疑问的欢迎评论

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/103364.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目管理软件适用于初创公司吗

我注意到关于小型团队的一件事是&#xff0c;在这种热情的背后隐藏着一家需要帮助的公司。他们通常缺乏职责结构&#xff0c;但这可能不是他们的主要需求。太多的结构会扼杀那些在较小的初创型公司中经营节目的企业家精神的努力&#xff0c;但他们几乎总是需要更有效的流程和一…

分布式理论之CAP定理

CAP定理介绍 CAP定理&#xff08;CAP theorem&#xff09;&#xff0c;又被称作布鲁尔定理&#xff08;Brewers theorem&#xff09;&#xff0c;它指出对于一个分布式计算系统来说&#xff0c;不可能同时满足以下三点 选项具体意义一致性&#xff08;Consistency&#xff09…

linux TxBytes RxBytes 探究

测试平台 &#xff1a;NXP LS1043A ARM64 内核版本&#xff1a; 两台设备通过网口eth2 对接。设备1发包&#xff0c;设备2收包&#xff0c;观察两设备 TX RX 包数、字节数。 1、准备数据包 流量仪设置包长1024, 抓取从流量仪发包&#xff0c;wireshark显示length 1020字…

即时通讯音视频开发之音频编解码技术的学习

总是有人问我研究音频编解码要看什么书&#xff0c;其实这是一个很难回答的问题&#xff0c;原因有很多&#xff1a; 做工程首先一个问题就是和课本学习不同&#xff0c;不是看书能解决的。 音频编解码技术在国内研究的人很少&#xff0c;包括总体的音频技术国外也研究不多…

攻防世界ics-06

攻防世界ics-06 题目描述&#xff1a;云平台报表中心收集了设备管理基础服务的数据&#xff0c;但是数据被删除了&#xff0c;只有一处留下了入侵者的痕迹。 打开场景&#xff0c;查看页面。 但凡有超链接的都点一遍&#xff0c;发现只有“报表中心可以打开”。 选择日期范围&a…

go 库 viper 配置解析神器

文章目录1. 简介2. 安装3. 建立默认值4. 读取配置文件5. 获取 key/value 方法5.1 Get() 方法5.2 IsSet()、GetStringMap()、GetStringMap() 方法6. 命令行选项7. 访问嵌套的键8. 写入配置文件9. 监控并重新读取配置文件10. 从io.Reader中读取11. Unmarshal12. 环境变量13. 远程…

【Three.js入门】图形用户界面GUI、BufferGeometry创建矩形、随机生成多个随机颜色的三角形

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端 &#x1f4c3;个人状态&#xff1a; 在校大学生一枚&#xff0c;已拿多个前端 offer&#xff08;秋招&#xff09; &#x1f680;未…

第四章操作系统测试

一. 单选题&#xff08;共24 题&#xff0c;72.0分&#xff09; (单选题,3.0分)用户编写的程序中所使用的地址是&#xff08; C &#xff09;。 A. 内存地址 B. 物理地址 C. 逻辑地址 D. 绝对地址 解释&#xff1a;逻辑地址&#xff1a;用户空间中使用的一种地址又称相对地址 …

一行 Python 代码能实现什么丧心病狂的功能?

手头有 109 张头部 CT 的断层扫描图片&#xff0c;我打算用这些图片尝试头部的三维重建。基础工作之一&#xff0c;就是要把这些图片数据读出来&#xff0c;组织成一个三维的数据结构&#xff08;实际上是四维的&#xff0c;因为每个像素有 RGBA 四个通道&#xff09;。这个数据…

gitLab

GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的web服务。下面是使用步骤 1. 注册 进入注册页面&#xff08;需要公司的人提供地址&#xff09;例如&#xff1a; http://xx.xxx.xx.xx:18000/users/sign_in …

大漠插件最新版7.2248

工具名称:大漠插件最新版7.2248 工具简介:/ v7.2242更新时间2022年11月16日:/ v7.2248 1. 优化某些模式,在绑定时,有小概率会卡死在绑定函数里的问题. 2. 解决Assemble DisAssemble和GetRemoteApiAddress的COM版本的DLL&#xff0c;在E语言下用类库封装后调用时,对64位地址解析…

4.http模块

http模块是Node.js官方提供创建web服务器的模块&#xff0c;在使用http模块前首先导入http模块 目录 1 一些概念 1.1 IP 1.2 域名 1.3 端口 2 创建一个基本的web服务器 3 req请求对象 4 res响应对象 5 不同地址获取不同响应 6 在服务中加载html文件 6.1 基…

vsomeip 快速入门

vsomeip 快速入门 文章目录vsomeip 快速入门1. 下载仓库2. 编译2.1 安装相关依赖2.2 编译vsomeip2.3 编译hello_world example3. 运行1. 下载仓库 git clone https://github.com/COVESA/vsomeip.git2. 编译 2.1 安装相关依赖 我的ubuntu 版本是20.04&#xff0c;所以以ubunt…

Python幂分布

文章目录幂分布帕累托分布Zipf分布power(a)p(x)axa−1p(x)ax^{a-1}p(x)axa−1幂分布pareto(a)p(x)amaxa1p(x)\frac{am^a}{x^{a1}}p(x)xa1ama​帕累托分布zipf(a)p(k)k−aζ(a)p(k)\frac{k^{-a}}{\zeta(a)}p(k)ζ(a)k−a​齐普夫分布 幂分布 幂分布的形式是非常简单的&#xff…

计算机毕设Python+Vue学习管理系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

大脑皮层的分割方法

大脑皮层分割的意义 神经元之间的相互联系构成了大脑内信息传递的主要手段&#xff0c;这些连接构成了一个复杂的网络。可以通过现代医学成像技术&#xff0c;如磁共振成像MRI在宏观尺度上进行估计 网络节点的定义是构建大脑连接网络的关键步骤之一。使用体素水平的网络具有高…

vue之动态组件

切换组件案例 点击一个tab-bar&#xff0c;切换不同的组件显示&#xff1a; 这个可以通过两种不同的思路来实现&#xff1a; 方式一&#xff1a;通过v-if来判断&#xff0c;显示不同的组件。方式二&#xff1a;动态组件的方式。 &#xff08;1&#xff09;通过v-if来判断显示不…

高粱根质膜中K~+ -ATPase活性重组入人工脂质体/硫修饰脂质体包裹的VEGF反义寡核苷酸的相关研究

小编在这里给大家整理了高粱根质膜中K~ -ATPase活性重组入人工脂质体/硫修饰脂质体包裹的VEGF反义寡核苷酸的相关研究&#xff0c;一起来看&#xff01; 高粱根质膜中K~ -ATPase活性重组入人工脂质体相关研究&#xff1a; 将高粱根质膜中K~ -ATPase活性重组入人工脂质体中 ,并…

迁移速度与计算性能兼得!天翼云DirtyLimit技术大显身手

虚拟机技术的快速发展使系统迁移变得更加灵活且多样化&#xff0c;其广泛应用也促使用户对虚拟机迁移速度和性能影响提出了更高要求。天翼云弹性计算虚拟化团队创新研发DirtyLimit虚拟机迁移加速技术&#xff0c;能够在保证读vCPU性能几乎不下降的情况下&#xff0c;有效缩短虚…

行业沙龙第五期丨供应商全生命周期管理赋能高质量采购

找不到好的供应商、供应商管理难&#xff0c;高成本效率低&#xff0c;货品质量难管控、交货不及时等等&#xff0c;导致错失了客户&#xff0c;太可惜了&#xff0c;怎么办呢&#xff1f;追根溯源&#xff0c;这些问题的源头多在于没有做好供应商管理。 供应商管理是供应链采…