Web端Excel的导入导出Demo

news2024/12/24 8:29:00

📚目录

  • 📚简介:
    • ✨代码的构建:
    • 💭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;
    }
}

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

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

相关文章

在Windows上安装Go编译器并配置Golang开发环境

文章目录 1、安装Go语言编译程序1.1、下载GoLang编译器1.2、安装GoLang编译器 2、配置Golang IDE运行环境2.1、配置GO编译器2.1.1、GOROOT 概述2.1.2、GOROOT 作用2.1.2、配置 GOROOT 2.2、配置GO依赖管理2.2.1、Module管理依赖2.2.2、GOPATH 管理依赖 2.3、运行GO程序2.3.1、创…

OpenCV 学习笔记2 C++

1.图像直方图 直方图&#xff08;Histogram&#xff09;是图像处理中常用的工具&#xff0c;它表示图像中每个像素强度值的分布情况。在OpenCV中&#xff0c;可以使用 cv::calcHist 函数来计算图像的直方图。 图像直方图是一种展示图像像素强度分布的统计图表。它显示了图像中…

Eclipse+Java+Swing实现图书信息管理系统-TXT存储信息

一、系统介绍 1.开发环境 操作系统&#xff1a;Win10 开发工具 &#xff1a;Eclipse2021 JDK版本&#xff1a;jdk1.8 存储方式&#xff1a;Txt文件存储 2.技术选型 JavaSwingTxt 3.功能模块 4.工程结构 5.系统功能 1.系统登录 管理员可以登录系统 2.查看图书 管理员…

Python数据分析案例42——基于Attention-BiGRU的时间序列数据预测

承接上一篇的学术缝合&#xff0c;排列组合模型&#xff0c;本次继续缝合模型演示。 Python数据分析案例41——基于CNN-BiLSTM的沪深300收盘价预测-CSDN博客 案例背景 虽然我自己基于各种循环神经网络做时间序列的预测已经做烂了.....但是还是会有很多刚读研究生或者是别的领…

Django处理枚举(枚举模型)以及source的使用

Django处理枚举-枚举模型 1、定义模型类、序列化器类2、对上面这些场景使用source参数3、支持连表查询4、自定义序列化输出方法5、案例5 1、定义模型类、序列化器类 定义模型类models.py&#xff1b;项目模型类、接口模型类、用例模型类 from django.db import modelsclass T…

【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1.理解软硬链接1.1 操作观…

AskManyAI:一个GPT、Claude、Gemini、Kimi等顶级AI的决斗场

一直以来很多人问我能不能有个稳定&#xff0c;不折腾的全球AI大模型测试网站&#xff0c;既能够保证真实靠谱&#xff0c;又能够保证稳定、快速&#xff0c;不要老动不动就挂了、出错或者漫长的响应。 直到笔者遇到了AskManyAI&#xff0c;直接就惊艳住了&#xff01; 话不多…

公布应用程序

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d8;相关专栏Rust初阶教程、go语言基础系列、spring教程等&#xff0c;大家有兴趣的可以看一看 &#x1f4d9;Jav…

亚马逊云科技官方重磅发布GenAI应用开发学习路线(全免费)

今天小李哥给大家分享的是亚马逊云科技&#xff08;AWS&#xff09;最近官方发布的GenAI应用开发最佳学习路线&#xff0c;不仅内容非常全面更主要的是全部免费&#xff01;大家动动小手就能成为GenAI开发大&#x1f42e;&#xff01; 1️⃣这个GenAI开发学习路线包括什么&…

.cur 鼠标光标编辑器

详解透明贴图和三元光栅操作 - CodeBus 鼠标指针文件格式解析——Windows&#xff08;二&#xff09; (qq.com) [C/C] RGBA数组生成Windows下的ico文件_c ico格式-CSDN博客 色环设计 - CodeBus 左键绘制 右键选颜色 ctrl右键设置鼠标热点 F1导出.cur文件 //代码来源&…

web3项目自动连接小狐狸以及小狐狸中的各种“地址”详解

刚做web3的时候&#xff0c;比较迷糊的就是人们口中说的各种地址&#xff0c;小狐狸钱包地址&#xff0c;私钥地址&#xff0c;跳转地址&#xff0c;接口地址&#xff0c;交易地址&#xff0c;等等XX地址&#xff0c;常常感觉跟做链的同事们说话不在一个频道。 这一小节&#x…

力扣:49. 字母异位词分组

知识点&#xff1a; 散列函数 散列函数能使对一个数据序列的访问过程更加迅速有效&#xff0c;通过散列函数&#xff0c;数据元素将被更快地定位&#xff1a; 1. 直接寻址法&#xff1a;取关键字或关键字的某个线性函数值为散列地址。即H&#xff08;key&#xff09;key或H&a…

CentOS 7安装Zookeeper

说明&#xff1a;本文介绍如何在CentOS 7操作系统下使用Zookeeper 下载安装 首先&#xff0c;去官网下载所需要安装的版本&#xff0c;我这里下载3.4.9版本&#xff1b; 上传到云服务器上&#xff0c;解压 tar -xvf zookeeper-3.4.9.tar.gz修改配置 进入Zookeeper目录下的co…

ssm049基于Vue.js的在线购物系统的设计与实现+vue

在线购物系统 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于在线购物系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了在线购物系统&#xff0c;它彻底改…

设计模式代码实战-外观模式

1、问题描述 小明家的电源总开关控制了家里的三个设备&#xff1a;空调、台灯和电视机。每个设备都有独立的开关密码&#xff0c;分别用数字1、2和3表示。即输入1时&#xff0c;空调关闭&#xff0c;输入2时&#xff0c;台灯关闭&#xff0c;输入3时&#xff0c;电视机关闭&am…

排序总结Java

文章目录 排序算法复杂度总结插入排序希尔排序归并排序快速排序堆排序 排序算法复杂度总结 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 插入排序 public class Sort {// 插入排序public int[] inserSort(int[] nums){for (int i 1; i < nums.length;…

科技助力输电线安全隐患预警,基于YOLOv8全系列【n/s/m/l/x】参数模型开发构建电力设备场景下输电线安全隐患目标检测预警系统

电力的普及让我们的生活变得更加便利&#xff0c;四通八达的电网连接着生活的方方面面&#xff0c;电力能源主要是依托于庞大复杂的电网电力设备进行传输的&#xff0c;有效地保障电网场景下输电线的安全对于保障我们日常生活所需要的电力有着重要的意义&#xff0c;但是电力设…

Redis报错:CROSSSLOT Keys in request don‘t hash to the same slot的解决方案

最近&#xff0c;项目上线的时候&#xff0c;出现了一个Redis的报错&#xff1a;CROSSSLOT Keys in request dont hash to the same slot&#xff0c;这个在内网环境下无法复现&#xff0c;因为正式环境的Redis是cluster集群模式&#xff0c;而我们内网环境是单机模式。(后面我…

Django第三方功能的使用

Django第三方功能的使用 Django REST framework前言1、Django--Restframework--coreapi版文档BUG:AssertionError: coreapi must be installed for schema support.How to run Django with Uvicorn webserver?2、序列化类 Serializer的使用模型序列化类 ModelSerializer的使用…

再写-全景拼接

全景拼接 1. 将读取进行灰度转化&#xff0c;并且输出图像&#xff0c;关键点和计算描述 import cv2 import numpy as np# 将读取进行灰度转化&#xff0c;并且输出图像&#xff0c;关键点和计算描述 image_left cv2.imread("C:\\Users\\HONOR\\Desktop\\image\\pinjie…