SpringBoot项目使用EasyExcel读取上传Excel

2023-11-08

SpringBoot项目使用EasyExcel读取上传Excel

1、EasyExcel简介

EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。

img

EasyExcel读取Excel的解析原理:

img

2、导入相应的依赖文件

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.2.3</version>
</dependency>

3、编写对应数据库字段的pojo类,使用注解注入

package com.ec.wlfxxt.db.po;


import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

import javax.persistence.Id;
import javax.persistence.Table;

@Table(name = "t_test_user")
@Data
public class TestUser {
    //主键
    /**
     * ExcelProperty注解 index参数是指第几列,0为第一列,1为第二列 ,value是对应的内容列
     */
    @ExcelProperty(index = 0)
    @Id
    private String userSid;

    @ExcelProperty(index = 1)
    private String userAccount;

    @ExcelProperty(index = 2)
//    @ExcelProperty(value = "用户姓名")
    private String userName;

    @ExcelProperty(index = 3)
    private Integer userSexSid;


}

4、编写对应下载的接口文件

(这里为固定的模版,不需要可以的去记录,大概了解执行流程即可,取即可用)

UserController层

   @PostMapping("/uploadLocal") //本地测试  @RequestParam("files")参数key名字
    public JsonResult uploadLocal(@RequestParam("files") MultipartFile[] excelFiles) throws IOException {

//        System.out.println("excelFile:"+excelFiles);
        if (excelFiles.length != 0) {
            if (userService.testExcelLocal( excelFiles) == 0){
                return new JsonResult(Constant.SUCCESS_CODE, "上传成功",null);
            }
            else {
                return new JsonResult(Constant.ERROR1_CODE, "文件保存失败",null);
            }
        }else {
            return new JsonResult(Constant.ERROR1_CODE, "文件不能为空",null);
        }
    }

    @PostMapping("/uploadServer")//服务器测试  @RequestParam("files")参数key名字
    public JsonResult uploadServer(@RequestParam("files") MultipartFile[] excelFiles) throws IOException {

//        System.out.println("excelFile:"+excelFiles);
        if (excelFiles.length != 0) {
            if (userService.testExcelServer( excelFiles) == 0){
                return new JsonResult(Constant.SUCCESS_CODE, "上传成功",null);
            }
            else {
                return new JsonResult(Constant.ERROR1_CODE, "文件保存失败",null);
            }
        }else {
            return new JsonResult(Constant.ERROR1_CODE, "文件不能为空",null);
        }
    }

UserServiceImpl层

//将文件存储到后读取
    public int testExcelLocal(MultipartFile[] excelFiles){
        //将文件存储到当前机器的某个目录
        String localPath = "E:\\JavaProject\\wlfxxt\\src\\main\\java\\com\\ec\\wlfxxt\\excelfile";

        for (MultipartFile excelFile:excelFiles) {

            //获取上传的文件的文件名 (ordersetting_template.xlsx)
            String originalFilename = excelFile.getOriginalFilename();
            String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
            //生成一个唯一文件名
            String uniqueFilename = UUID.randomUUID().toString().replaceAll("-", "") + suffix;

            String dirPath = localPath ;
            //确保存放文件的目录是存在的
            File dirFile = new File(dirPath);
            if (!dirFile.exists()){
                dirFile.mkdirs();
            }
            //最终存放文件的文件路径
            String filePath = dirPath + "\\" + uniqueFilename;
            System.out.println(filePath);

            //保存文件
            try {
                excelFile.transferTo(new File(filePath));
            } catch (IOException e) {
                e.printStackTrace();
                return 1;
            }

            //读取上传后的文件中的内容,将数据添加/更新到ordersetting表中
        /*
            参数一File file: 要读取的目标文件
            参数二Class head :将目标文件中的行记录封装到java的那个类型对象
            参数三ReadListener readListener :读取过程中的回调对象(每读取一行,封装成一个对象后,都会触发这个对象的invoke方法)
         */
            List<TestUser> testUsers = new ArrayList<>();
            EasyExcel.read(new File(filePath),TestUser.class,new SyncReadListener(){

                //读取每一行进行的操作
                @Override
                public void invoke(Object object, AnalysisContext context) {
                    testUsers.add((TestUser) object);
                }
                //读取表头
                @Override
                public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
                    System.out.println("表头信息:"+headMap);
                }
            }).headRowNumber(3).doReadAll();//.headRowNumber(3)表示从第几行开始读取,有的文件title不在第一行


            System.out.println("===========");
            System.out.println(testUsers);
//        //更新或者添加
//        for (TestUser orderSetting : orderSettings) {
//            userMapper.insert(orderSetting);
//        }


        }
        return 0;

    }

    //将文件存储到后读取
    public int testExcelServer(MultipartFile[] excelFiles){
        //将文件存储到服务器的某个目录
        String localPath = "/usr/local/middleware/GIT_NTP_WLFXXT_Code_Mid/excleFile";

        for (MultipartFile excelFile:excelFiles) {
            //获取上传的文件的文件名 (ordersetting_template.xlsx)
            String originalFilename = excelFile.getOriginalFilename();
            String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
            //生成一个唯一文件名
            String uniqueFilename = UUID.randomUUID().toString().replaceAll("-", "") + suffix;

            String dirPath = localPath;
            //确保存放文件的目录是存在的
            File dirFile = new File(dirPath);
            if (!dirFile.exists()){
                dirFile.mkdirs();
            }
            //最终存放文件的文件路径
            String filePath = dirPath + "/" + uniqueFilename;
            System.out.println(filePath);

            //保存文件
            try {
                excelFile.transferTo(new File(filePath));
            } catch (IOException e) {
                e.printStackTrace();
                return 1;
            }

            //读取上传后的文件中的内容,将数据添加/更新到ordersetting表中
        /*
            参数一File file: 要读取的目标文件
            参数二Class head :将目标文件中的行记录封装到java的那个类型对象
            参数三ReadListener readListener :读取过程中的回调对象(每读取一行,封装成一个对象后,都会触发这个对象的invoke方法)
         */
            List<TestUser> testUsers = new ArrayList<>();
            EasyExcel.read(new File(filePath),TestUser.class,new SyncReadListener(){
                //读取每一行进行的操作
                @Override
                public void invoke(Object object, AnalysisContext context) {
                    testUsers.add((TestUser) object);
                }
                //读取表头
                @Override
                public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
                    System.out.println("表头信息:"+headMap);
                }
            }).headRowNumber(3).doReadAll();//.headRowNumber(3)表示从第几行开始读取,有的文件title不在第一行


            System.out.println("===========");
            System.out.println(testUsers);
//        //更新或者添加
//        for (TestUser orderSetting : orderSettings) {
//            userMapper.insert(orderSetting);
//        }


        }

        return 0;
    }

5、postman测试接口

单个和多个文件都可

key 的名字要和controller代码RequestParam里面的一致

public JsonResult uploadLocal(@RequestParam(“files”) MultipartFile[] excelFiles) throws IOException {

}

    }

    return 0;
}





## 5、postman测试接口

**单个和多个文件都可**  

key 的名字要和controller代码RequestParam里面的一致

public JsonResult uploadLocal(**@RequestParam("files")** MultipartFile[] excelFiles) throws IOException {

![image-20230315202239481](https://img-blog.csdnimg.cn/img_convert/bc111231dc8f7208ddaf965117b58167.png)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot项目使用EasyExcel读取上传Excel 的相关文章

  • Firebase 查询 Or'ing whereEqualTo 以获得可能值的列表

    我见过之前针对早期版本的 Firebase 提出过这个问题 https stackoverflow com questions 26700924 query based on multiple where clauses in fireba
  • JavaEE 8 教程,在 hello1 项目上部署失败

    我正在尝试学习 Java EE 8 我遵循了官方指南https javaee github io tutorial https javaee github io tutorial 但我有这个问题 cargo maven2 plugin 1
  • Java Swing:清除JList而不触发监听器

    我的情况如下 我有一个 JList 只要在列表中进行选择 它就会触发搜索 使用 ListSelectionListener 我正在尝试使用以下命令重置列表上的选择list clearSelection 这样做的问题是使用clearSelec
  • Spring webflow 应用程序:HTTP 302 暂时移动

    我的 java 应用程序中的每个请求都会生成另外 2 个带有 HTTP 302 错误的请求 例如 如果请求查看名为板 html 这个请求是从首页 html 我收到按以下顺序生成的 3 个请求 POST home html 302 Moved
  • Maven + Cobertura:无法找到[您的班级]。你指定了源目录吗?

    我有 MyMath 类 有两个简单的方法 multi 和 add 和测试类只会测试多种方法 public class MainTest Test public void testMultiply MyMath tester new MyMa
  • JUnit Eclipse 显示 System.out.print() 的

    我正在使用 JUnit 3 和 Eclipse 3 4 当我运行 JUnit 测试用例时 一切正常并且测试完美完成 唯一的事情是我想查看我正在运行的类的输出 所有类都具有一些输出值的基本 System out print 因此 当我运行测试
  • java“void”和“非void”构造函数

    我用 java 编写了这个简单的类 只是为了测试它的一些功能 public class class1 public static Integer value 0 public class1 da public int da class1 v
  • @PreUpdate 不适用于 Spring Data JPA

    我有一个实体 Entity EntityListeners MyEntityListener class class MyEntity 还有听者 class MyEntityListener PrePersist PreUpdate pub
  • 如何用xlrd读取公式

    我正在尝试做一个解析器 它读取几个 Excel 文件 我通常需要位于行底部的值 您可以在其中找到所有上部元素的总和 因此 单元格值实际上是 sum 或 A5 0 5 可以说 对于使用 Excel 打开此文件的用户来说 它看起来像一个数字 这
  • 会话 bean 中的 EntityManager 异常处理

    我有一个托管无状态会话 bean 其中注入了 EntityManager em 我想做的是拥有一个具有唯一列的数据库表 然后我运行一些尝试插入实体的算法 但是 如果实体存在 它将更新它或跳过它 我想要这样的东西 try em persist
  • 您能让 Tomcat 6 stdout.log 文件表现得像 log4j DailyRollingFileAppender 吗?

    我们使用的是 Tomcat 6 的 Windows 安装 默认情况下 我们应用程序的 log4j 输出将转到 catalina base logs stdout log 文件 该日志文件仅在我们重新启动 Tomcat 时滚动 并且文件名始终
  • 如何自定义JProgressBar?

    我正在制作一个启动器 我想要一个自定义的进度栏 我已经做了一些研究 并且可以使用 JavaFX 从未用它做过任何事情 并且可以通过替换 UI 来实现 我正在寻找一个具有圆形边缘和圆形填充的酒吧 像这样的事情 package gui impo
  • java JFileChooser 文件大小过滤器

    我知道我可以按文件类型进行过滤 但是可以按文件大小进行过滤吗 例如 JFileChooser 仅显示 3 MB 以内的图片 简短的回答应该是 你尝试过什么 长答案是肯定的 JFileChooser fc new JFileChooser f
  • VBA rand 如何使用上限和下限生成随机数?

    所以也许这是多余的 也许这就像问为什么大多数人生来就有 5 个手指 最后的简短答案总是 因为事情就是这样 而且它就是这样工作的 但我讨厌这个答案 该死的我想知道怎么做VBA 中的 Rnd 函数有效 Ms Office Excel 的 MSD
  • 用 Java 创建迷宫求解算法

    我被分配了用 Java 创建迷宫求解器的任务 这是任务 Write an application that finds a path through a maze The maze should be read from a file A
  • RMI 服务器:rmiregistry 或 LocateRegistry.createRegistry

    对于服务器端的RMI 我们需要启动吗rmiregistry程序 或者只是调用LocateRegistry createRegistry 如果两者都可以的话 各有什么优点和缺点 他们是同一件事 rmiregistry是一个单独的程序 您可以从
  • 防止 Firebase 中的待处理写入事务不起作用

    我的目标是在单击按钮时将名称插入 Cloud Firestore 中 但如果用户未连接到互联网 我不希望保存处于挂起状态 我不喜欢 Firebase 保存待处理写入的行为 即使互联网连接已恢复 我研究发现Firebase 开发人员建议使用事
  • 监控 Java 应用程序上的锁争用

    我正在尝试创建一个小基准 在 Groovy 中 以显示几个同步方法上的高线程争用 当监控自愿上下文切换时 应该会出现高争用 在 Linux 中 这可以通过 pidstat 来实现 程序如下 class Res private int n s
  • 使用 Android 的 Mobile Vision API 扫描二维码

    我跟着这个tutorial http code tutsplus com tutorials reading qr codes using the mobile vision api cms 24680关于如何构建可以扫描二维码的 Andr
  • 将隐藏(生物识别)数据附加到 pdf 上的数字签名

    我想知道是否可以使用 iText 我用于签名 或 Java 中的其他工具在 pdf 上添加生物识别数据 我会更好地解释一下 在手写板上签名时 我会收集签名信息 例如笔压 签名速度等 我想将这些信息 java中的变量 与pdf上的签名一起存储

随机推荐

  • layui文档,最新文档地址,官网已经下线

    最新文档地址 官网已经下线了 http layui shagua wiki layuidoc doc index html
  • linux(ubuntu) git目录下设置显示内容

    gt vim bashrc 添加并退出 GIT PS1 SHOWDIRTYSTATE false GIT PS1 SHOWCOLORHINTS false PROMPT COMMAND git ps1 u h w gt source bas
  • 网络地址与直接广播地址有关计算

    一 已知IP地址和子网掩码 1 网络地址 网络号 IP 子网掩码 2 直接广播地址 网络地址 网络号不变 主机号变全1 3 主机号 IP 取反 子网掩码 网络号全0 4 子网内第一个可用IP地址 网络号 1 网络地址 1 5 主机数 2 n
  • C++ explicit关键字浅析

    explicit关键字 今天在看std thread的时候 发现他的构造函数是这样的 explicit thread Fn fn Args args explicit这个关键字很眼熟 因为在Qt中默认的构造函数也是用的这个关键字 expli
  • Unity 2D像素游戏序列帧动画制作规范

    一 问题背景 笔者遇到了很多很多跟美术策划协作的问题 首先声明本文不考虑SpriteAltas 也不绝对正确 仅供参考 错误可以在评论区指出我进行修改以免误导 我们可以清楚的看到跳跃后会出现角色跟碰撞器大小不一样的情况 这个时候如果我去碰右
  • 软件开发中的SD、SE、QA和RD是什么意思?

    2019独角兽企业重金招聘Python工程师标准 gt gt gt QA QA即英文QUALITY ASSURANCE 的简称 中文意思是品质保证 其在ISO8402 1994中的定义是 为了提供足够的信任表明实体能够满足品质要求 而在品质
  • “卷爆了“的IT互联网行业,为啥至今还有人头铁往里冲?

    细数互联网过往的发展史 造就了成千上万的企业家 创业者 众多职场人趋之若鹜地选择互联网行业 想从这个领域捞一桶金 但不知道从什么时候开始 一篇篇关于互联网红利消失 流量枯竭的文章接踵而至 现在转行互联网 做什么看起来都是那么困难 很多从业者
  • 有趣的数据结构算法3——单链表尾插法和头插法的实现

    有趣的数据结构算法3 单链表尾插法和头插法的实现 什么是单链表 头插法的实现 尾插法的实现 头插法实现代码 尾插法实现代码 GITHUB下载连接 以前学习C语言的时候 对于指针 链表什么的是最害怕的 但是现在 什么是单链表 单链表是一种链式
  • 在Visual Studio Code中使用CSSComb格式化CSS文件

    在Visual Studio Code中使用CSSComb格式化CSS文件 最近在使用Visual Studio Code 开始逐渐上手 发现非常好用 不管是在JS文件还是在HTML文件中 右键点击 都有 格式化文件 的菜单 帮助我们排版
  • linux查看服务端口号、查看端口(netstat、lsof)

    linux查看服务端口号 查看端口 netstat lsof netstat atulnp会显示所有端口和所有对应的程序 用grep管道可以过滤出想要的字段 a all 表示列出所有的连接 服务监听 Socket资料 t tcp 列出tcp
  • 配置docker阿里云镜像加速

    默认情况下docker安装镜像文件是从docker官方的镜像中心下载 https hub docker com 有时速度慢 可以通过配置docker阿里云镜像来加速 配置后 就从国内阿里云下载 注册阿里云用户 登录 gt 工作台 gt 产品
  • 200 ok 几种状态

    浏览器加载资源成功一般会有几种状态 200 ok 从原始服务器请求成功 200 ok from cache 200 ok from disk cache 200 ok from memory cache 304 not modified 向
  • mysql sql语句查询指定月份

    需求 根据输入年月 查询指定数据 方法1 SELECT FROM 表名 WHERE YEAR 列名 年份 AND MONTH 列名 月份 方法2 SELECT FROM 表名 WHERE date format 列名 Y m 2020 01
  • JDBC快速入门,mysql8.0版本+druid+spring jdbc使用,出现因版本错误的解决方法

    JDBC核心技术 JDBC概述 数据持久化 持久化 persistence 把数据保存到可掉电式存储设备中以供之后使用 大多数情况下 特别是企业级应用数据持久化意味着将内存中的数据保存到硬盘上加以 固化 而持久化的实现过程大多通过各种关系数
  • runaway

    runaway函数 这个程序是查看你所用的电脑中所分配的栈的大小 include
  • 解决Java从MySQL读取大量数据时卡…

    今天晚上突然有个服务无法启动 这个服务在启动的时候会从数据库中加载一些数据 查看日志 有开始加载的日志 但没有完成加载的日志 判断问题是在加载数据时卡住 用top查看进程 发现CPU占用为0 又怀疑可能是因为jvm内存不够 用jstat查看
  • js限制输入框字数

  • Ubuntu上配置VS Code调试C++

    直接使用GDB在Ubuntu上调试C code 有时不是很方便 这里介绍下在Ubuntu上通过Visual Studio Code调试C code操作步骤 通过CMake编译 安装所需依赖 1 在Ubuntu上安装Visual Studio
  • Qt学习之QMainWindow(一)QMainWindow简介

    详细的后续会讲到 这里重在理解过程 Qt中的顶层窗口称为MainWindow 属于类QMainWindow QMainWindow也是继承于QWidget 通过子类化QMainWindow可以创建一个应用程序的窗口 MainWindow的结
  • SpringBoot项目使用EasyExcel读取上传Excel

    SpringBoot项目使用EasyExcel读取上传Excel 1 EasyExcel简介 EasyExcel是一个基于Java的简单 省内存的读写Excel的开源项目 在尽可能节约内存的情况下支持读写百M的Excel EasyExcel