Web端Excel的导入导出Demo

📚目录

  • 📚简介:
    • ✨代码的构建:
    • 💭Web端接口Excel操作
      • 🚀下载接口
      • 🚀导入读取数据接口
    • 🏡本地Excel文件操作
      • ⚡导出数据
      • 🌈导入读取数据

📚简介:

      使用阿里巴巴开源组件Easy Excel对Excel的读取和写入。如需更详细查看官方文档,当前案例主要对Web端的数据导出,和Excel文件上传到服务端进行数据解析的Demo.其中主要的是工具类的用法。

工具类的主要用法:

  • web端接口导出
  • web接口导入
  • 本地文件读取
  • 本地文件导出

✨代码的构建:

Maven坐标

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--easyexcel导出-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.0</version>
            <exclusions>
                <exclusion>
                    <artifactId>poi-ooxml-schemas</artifactId>
                    <groupId>org.apache.poi</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.xmlbeans</groupId>
            <artifactId>xmlbeans</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.7</version>
        </dependency>
        <!--这个库提供了操作 Microsoft Office 格式文件的核心功能,包括读取和写入 ExcelWordPowerPoint 等文件格式的能力。-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.0</version>
        </dependency>
        <!--这个库提供了对 OOXML 格式文件的读写能力,因此在处理 .xlsx 格式的 Excel 文件时需要导入这个库。-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.0</version>
        </dependency>
    </dependencies>

项目结构:

在这里插入图片描述

EasyExcelUtils 工具代码我放到文章的末尾,其他工具类如果需要的话可以去Gitee上拉代码自行查看 项目Demo

解析类的Excel注解解释

@Data
public class UserInfo {
    /**
     * 姓名
     */
    @ExcelProperty(value = "姓名",index = 0)
    private String name;
    /**
     * 性别
     */
    @ExcelProperty(value ="性别",index = 1)
    private String sex;
    /**
     * 年龄
     */
    @ExcelProperty(value ="年龄",index = 2)
    private Integer age;
    /**
     * 忽略这个字段 ExcelIgnore添加后导出和导入都会过滤这个字段
     */
    //@ExcelIgnore()
    @ExcelProperty(value ="手机",index = 3)
    private String phone;
}
  • ExcelProperty index 指定写到第几列,默认根据成员变量排序(使用了index那读取的时候Excel中的文件必须和这个index对应,Excel默认第一个字段就是index=0)。value指定写入的名称,默认成员变量的名字,多个value可以参照快速开始中的复杂头
  • ExcelIgnore 添加后导出和导入都会过滤这个字段
  • DateTimeFormat 日期转换,将Date写到excel会调用这个注解。里面的value参照java.text.SimpleDateFormat
  • NumberFormat 数字转换,用Number写excel会调用这个注解。里面的value参照java.text.DecimalFormat

ExcelProperty的属性介绍

在这里插入图片描述

💭Web端接口Excel操作

本次使用的是ApiPost工具模拟接口请求

🚀下载接口

代码

    @GetMapping("userInfo/excelExport")
    public ResultData userInfoExcelExport() {
        List<UserInfo> userInfoList = getUserInfoList();
        EasyExcelUtils.download("用户列表", userInfoList);
        return ResultData.success();
    }

    public List<UserInfo> getUserInfoList() {
        List<UserInfo> userInfoList = new ArrayList<>();
        List<String> sexStrList = Arrays.asList("男", "女");
        Random sexRandom = new Random();
        for (int i = 0; i < 10; i++) {
            UserInfo userInfo = new UserInfo();
            String sexStr = sexStrList.get(sexRandom.nextInt(sexStrList.size()));
            userInfo.setSex(sexStr);
            String name = UserBuildUtils.buildName(sexStr);
            userInfo.setName(name);
            userInfo.setAge(RandomUtils.nextInt(18, 35));
            userInfo.setPhone(UserBuildUtils.generatePhoneNumber());
            userInfoList.add(userInfo);
        }
        return userInfoList;
    }

效果

在这里插入图片描述

下载文件中打开

在这里插入图片描述

在这里插入图片描述

🚀导入读取数据接口

代码

    @PostMapping("userInfo/excelImport")
    public ResultData userInfoExcelImport(@RequestParam("file") MultipartFile file) throws IOException {
        //解析导入的excel文件成对象
        List<UserInfo> userInfoList = EasyExcelUtils.readExcel(UserInfo.class, file.getInputStream());
        //处理对象
        System.out.println(userInfoList);
        return ResultData.success();
    }

效果

本地文件用户列表1713077847559.xlsx文件中一共有100条用户数据,接下来使用工具请求导入接口完成Excel文件数的读取

在这里插入图片描述

请求接口:

在这里插入图片描述
在这里插入图片描述

🏡本地Excel文件操作

⚡导出数据

代码

       /**
     * Excel的导出
     */
    @Test
    void ExcelExport() {
        String outFile = System.getProperty("user.dir") + File.separatorChar + "file";

        List<UserInfo> userInfoList = new ArrayList<>();
        List<String> sexStrList = Arrays.asList("男","女");
        Random sexRandom = new Random();
        for (int i = 0; i < 100; i++) {
            UserInfo userInfo = new UserInfo();
            String sexStr = sexStrList.get(sexRandom.nextInt(sexStrList.size()));
            userInfo.setSex(sexStr);
            String name = UserBuildUtils.buildName(sexStr);
            userInfo.setName(name);
            userInfo.setAge(RandomUtils.nextInt(18, 35));
            userInfo.setPhone(UserBuildUtils.generatePhoneNumber());
            userInfoList.add(userInfo);
        }
        String outFileName = "用户列表" + System.currentTimeMillis() + ".xlsx";
        EasyExcelUtils.write(outFile, outFileName, UserInfo.class, userInfoList, "用户列表");
    }

效果:会在当前工程中的file文件夹中创建导出的Excel文件

在这里插入图片描述

🌈导入读取数据

代码

    /**
     * Excel导入
     */
    @Test
    void ExcelImport() {
        //Excel文件路径
        String filePath = System.getProperty("user.dir") + File.separatorChar + "file" + File.separatorChar
                + "readFile" + File.separatorChar + "用户列表1713077847559.xlsx";
        List<UserInfo> userInfoList = EasyExcelUtils.readExcel(UserInfo.class, filePath);
        System.out.println(userInfoList);
    }

效果: 指定需要读取的文件路径

在这里插入图片描述

EasyExcelUtils 工具类:


/**
 * @Author itmei
 * @Date 2024/4/13 20:49
 * @description:
 * @Title: EasyExcelUtils
 * @Package com.itmei.exceldemo.utils
 */
public class EasyExcelUtils {

    /**
     * 写文件
     *
     * @param outFileName 写的路径
     * @param clazz       用于获取类中的Excel注解
     * @param list        数据
     */
    public static void write(String outFileName, Class<?> clazz, List<?> list) {
        // 新版本会自动关闭流,不需要自己操作
        EasyExcel.write(outFileName, clazz).sheet().doWrite(list);
    }

    /**
     * 写文件
     *
     * @param outFileName 文件名称
     * @param clazz       用于获取类中的Excel注解
     * @param list        数据
     * @param sheetName   工作簿名称
     */
    public static void write(String outFileName, Class<?> clazz, List<?> list, String sheetName) {
        // 新版本会自动关闭流,不需要自己操作
        EasyExcel.write(outFileName, clazz).sheet(sheetName).doWrite(list);
    }

    /**
     * 写文件
     *
     * @param outFile     保存的文件位置(必须存在否则报错)
     * @param outFileName 文件名称
     * @param clazz       用于获取类中的Excel注解
     * @param list        数据
     * @param sheetName   工作簿名称
     */
    public static void write(String outFile, String outFileName, Class<?> clazz, List<?> list, String sheetName) {
        // 新版本会自动关闭流,不需要自己操作
        ExcelWriterBuilder excelWriterBuilder = EasyExcel.write(outFile + File.separatorChar + outFileName, clazz);
        excelWriterBuilder.sheet(sheetName).doWrite(list);
    }

    /**
     * 写文件
     *
     * @param outputStream 输出流
     * @param list         数据
     * @param sheetName    工作簿名称
     */
    public static void write(OutputStream outputStream, List<?> list, String sheetName) {
        Class<?> clazz = list.get(0).getClass();
        // sheetName为sheet的名字,默认写第一个sheet
        EasyExcel.write(outputStream, clazz).sheet(sheetName).doWrite(list);
    }

    /**
     * 文件下载,用于前端下载Excel
     *
     * @param sheetName 工作簿名称
     * @param list      数据
     * @throws IOException
     */
    public static void download(String sheetName, List<?> list) {
        HttpServletResponse response = HttpServletUtil.getResponse();
        try {
            Class<?> clazz = list.get(0).getClass();
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            String fileName = URLEncoder.encode(sheetName + "_" + DateUtils.format(new Date()), "UTF-8").replaceAll("\\+", "%20") + ".xlsx";
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName);
            EasyExcel.write(response.getOutputStream(), clazz)
                    .autoCloseStream(false)
                    .sheet(sheetName)
                    .doWrite(list);
        } catch (Exception e) {
            handleException(response, e);
        }
    }

    private static void handleException(HttpServletResponse response, Exception e) {
        response.reset();
        response.setContentType("application/json");
        response.setCharacterEncoding("utf-8");
        Map<String, Object> map = MapUtils.newHashMap();
        map.put("status", "failure");
        map.put("message", "下载文件失败" + e.getMessage());
        try {
            response.getWriter().println(mapToJsonString(map));
        } catch (IOException ioException) {
            ioException.printStackTrace();
        }
    }

    /**
     * 将 Map 对象转换成 JSON 格式的字符串
     *
     * @param map
     * @return
     */
    public static String mapToJsonString(Map<String, Object> map) {
        StringBuilder json = new StringBuilder("{");
        boolean first = true;

        for (Map.Entry<String, Object> entry : map.entrySet()) {
            if (!first) {
                json.append(",");
            }
            json.append("\"").append(entry.getKey()).append("\":");
            Object value = entry.getValue();
            if (value instanceof String) {
                json.append("\"").append(value).append("\"");
            } else {
                json.append(value);
            }
            first = false;
        }

        json.append("}");
        return json.toString();
    }

    /**
     * 读取Excel文件并且返回集合对象
     *
     * @param classT
     * @param filePath
     * @param <T>
     * @return
     */
    public static <T> List<T> readExcel(Class<T> classT, String filePath) {
        List<T> readAllList = new ArrayList<>();
        EasyExcel.read(filePath, classT, new ReadListener<T>() {
            @Override
            public void invoke(T data, AnalysisContext context) {
                //这个每一条数据解析都会来调用
                readAllList.add(data);
            }

            @Override
            public void doAfterAllAnalysed(AnalysisContext context) {
                //全部读取完成后会调用
            }
        }).sheet().doRead();
        return readAllList;
    }

    public static <T> List<T> readExcel(Class<T> classT, InputStream inputStream) {
        List<T> readAllList = new ArrayList<>();
        try {
            EasyExcel.read(inputStream, classT, new ReadListener<T>() {
                @Override
                public void invoke(T data, AnalysisContext context) {
                    // 这个每一条数据解析都会来调用
                    readAllList.add(data);
                }

                @Override
                public void doAfterAllAnalysed(AnalysisContext context) {
                    // 全部读取完成后会调用
                    try {
                        inputStream.close(); // 关闭输入流
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).sheet().doRead();
        } catch (Exception e) {
            e.printStackTrace();
            // 处理异常情况,比如日志记录或者抛出自定义异常
        }
        return readAllList;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在Mac中打开终端的3种方法

在使用Mac时&#xff0c;有时需要深入研究设置&#xff0c;或者完成一些开发人员级的命令行任务。为此&#xff0c;你需要终端应用程序来访问macOS上的命令行。下面是如何启动它。 如何使用聚焦搜索打开终端 也许打开终端最简单、最快的方法是通过聚焦搜索。要启动聚焦搜索&a…

Collection与数据结构 二叉树(三):二叉树精选OJ例题(下)

1.二叉树的分层遍历 OJ链接 上面这道题是分层式的层序遍历,每一层有哪些结点都很明确,我们先想一想普通的层序遍历怎么做 /*** 层序遍历* param root*/public void levelOrder1(Node root){Queue<Node> queue new LinkedList<>();queue.offer(root);while (!qu…

支持向量机模型pytorch

通过5个条件判定一件事情是否会发生&#xff0c;5个条件对这件事情是否发生的影响力不同&#xff0c;计算每个条件对这件事情发生的影响力多大&#xff0c;写一个支持向量机模型pytorch程序,最后打印5个条件分别的影响力。 示例一 支持向量机&#xff08;SVM&#xff09;是一种…

详解拷贝构造

拷贝构造的功能 写法&#xff1a; 拷贝构造函数的参数为什么是引用类型 系统自动生成的拷贝构造函数 拷贝构造的深拷贝与浅拷贝 概念 浅拷贝&#xff1a; 深拷贝 小结 拷贝构造的功能 拷贝构造函数可以把曾经实例化好的对象的数据拷贝给新创建的数据 &#xff0c;可见…

基于SpringBoot+Mybatis框架的私人影院预约系统(附源码,包含数据库文件)

基于SpringBootMybatis框架的私人影院预约系统&#xff0c;附源码&#xff0c;包含数据库文件。 非常完整的一个项目&#xff0c;希望能对大家有帮助哈。 本系统的完整源码以及数据库文件都在文章结尾处&#xff0c;大家自行获取即可。 项目简介 该项目设计了基于SpringBoo…

软考126-上午题-【软件工程】-测试方法

一、测试方法 在软件测试过程中&#xff0c;应该为定义软件测试模板&#xff0c;即将特定的测试方法和测试用例设计放在一系列的测试步骤中。 软件测试方法分为&#xff1a;静态测试和动态测试。 1-1、静态测试。 静态测试是指被测试程序不在机器上运行&#xff0c;而是采用…

事务隔离级别的无锁实现方式 -- MVCC

MVCC的全称是Multiversion Concurrency Control(多版本并发控制器)&#xff0c;是一种事务隔离级别的无锁的实现方式&#xff0c;用于提高事务的并发性能&#xff0c;即事务隔离级别的一种底层实现方式。 在了解MVCC之前&#xff0c;我们先来回顾一些简单的知识点&#xff1a;…

最优算法100例之47-从尾到头打印单链表

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 从尾到头打印单链表 题解报告 方法1:头插法逆置单链表然后依次打印;注意此处是不带头结点的单链表,带头节点的操作稍微有…

网络篇09 | 运输层 udp

网络篇09 | 运输层 udp 01 简介UDP 是面向报文的 02 报文协议 01 简介 UDP 只在 IP 的数据报服务之上增加了一些功能&#xff1a;复用和分用、差错检测 UDP 的主要特点&#xff1a;无连接。发送数据之前不需要建立连接。 使用尽最大努力交付。即不保证可靠交付。 面向报文。…

【信号处理】心电信号传统R波检测定位典型方法实现(matlab)

关于 心电信号中QRS波检测是一个非常重要的步骤&#xff0c;可以用于实现重要波群的基本定位&#xff0c;在定位基础上&#xff0c;可以进一步分析心电信号的特征变化&#xff0c;从而为医疗诊断提供必要的参考。 工具 MATLAB ECG心电信号 方法实现 ECG心电信号加载 ecg …

基于深度学习的花卉检测系统(含PyQt界面)

基于深度学习的花卉检测系统&#xff08;含PyQt界面&#xff09; 前言一、数据集1.1 数据集介绍1.2 数据预处理 二、模型搭建三、训练与测试3.1 模型训练3.2 模型测试 四、PyQt界面实现参考资料 前言 本项目是基于swin_transformer深度学习网络模型的花卉检测系统&#xff0c;…

架构师系列-搜索引擎ElasticSearch(八)- 集群管理故障恢复

故障转移 集群的master节点会监控集群中的节点状态&#xff0c;如果发现有节点宕机&#xff0c;会立即将宕机节点的分片数据迁移到其它节点&#xff0c;确保数据安全&#xff0c;这个叫做故障转移。 下图中node1是主节点&#xff0c;其他两个节点是从节点 节点故障 此时node1…

【uniapp】vscode安装插件、ts校验、允许json文件注释

1、vscode安装的插件&#xff1a; uni-create-viewuni-hlperuniapp小程序扩展 2、ts校验 安装插件&#xff1a; pnpm i -D types/wechat-miniprogram uni-helper/uni-app-types配置tsconfig.json {"extends": "vue/tsconfig/tsconfig.json","compi…

论文笔记:The Expressive Power of Transformers with Chain of Thought

ICLR 2024 reviewer 评分 6888【但是chair 很不喜欢】 1 intro 之前的研究表明&#xff0c;即使是具有理想参数的标准Transformer&#xff0c;也无法完美解决许多大规模的顺序推理问题&#xff0c;如模拟有限状态机、判断图中的节点是否相连&#xff0c;或解决矩阵等式问题 这…

IOS 短信拦截插件

在使⽤iOS设备的时候, 我们经常会收到1069、1065开头的垃圾短信, 如果开了iMessage会更严重, 各种乱七⼋糟的垃圾信息会时不时地收到。 从iOS11开始, ⼿机可以⽀持恶短信拦截插件了. 我们可以通过该插件添加⼀些规则通过滤这些不需要的信息. ⼀. 使⽤xcode新建⼀个项⽬ 【1】…

MongoDB 初识

介绍 MongoDB是一种开源的文档型数据库管理系统&#xff0c;它使用类似于JSON的BSON格式&#xff08;Binary JSON&#xff09;来存储数据。与传统关系型数据库不同&#xff0c;MongoDB不使用表和行的结构&#xff0c;而是采用集合&#xff08;Collection&#xff09;(Mysql表)和…

LabVIEW直流稳定电源自动化校准系统

LabVIEW直流稳定电源自动化校准系统 直流稳定电源正向着智能化、高精度、多通道、宽量程的方向发展。基于LabVIEW开发环境&#xff0c;设计并实现了一种直流稳定电源自动化校准系统&#xff0c;以提升校准过程的整体效能&#xff0c;实现自动化设备替代人工进行电源校准工作。…

【DNS】

文章目录 DNS域名解析系统&#xff08;Domain Name System&#xff09;DNS系统需要解决的问题DNS域名解析系统&#xff08;Domain Name System&#xff09;问题1&#xff1a;DNS名字空间(The DNS Name Space&#xff09;DNS名字空间(The DNS Name Space)DNS名字空间(The DNS Na…

oracle 19c 主备 补丁升级19.22

补丁升级流程 备库升级 备库备份$ORALCE_HOME du -sh $ORACLE_HOME ​​​​​​​ 备份目录将dbhome_1压缩 cd $ORACLE_HOME cd .. Ls tar -cvzf db_home.tar.gz db_home_1 /opt/oracle/product/19c ​​​​​​​​​​​​​​ 关闭监听关闭数据库查看sq…

基于表面势的增强型p-GaN HEMT器件模型

来源&#xff1a;电子学报 22年 摘要 为了满足功率电路及系统设计对p-GaN HEMT&#xff08;High Electron Mobility Transistor&#xff09;器件模型的需求&#xff0c;本文建立了一套基于表面势计算方法的增强型p-GaN HEMT器件SPICE&#xff08;Simulation Program with Int…