快速在springboot项目中应用EasyExcel

news2024/9/23 21:24:50

目录

​编辑一、介绍

二、准备工作

三、初始化项目

3.1 创建项目 

3.2 引入依赖

3.3 创建数据库和数据表

 3.4 编写application.properties文件

 四、开始编写

4.1 目录结构

4.2 MyBatis配置类

4.3 用户实体类

 4.4 mapper接口

4.5 编写数据操作文件

 4.6  编写Service 业务层

 4.7 控制器层

4.8 编写主页面

五、运行

一、介绍

EasyExcel 是阿里巴巴开源的简化Excel文件读取和写入的开源库。主要的特点如下:

  • 简单易用的API:EasyExcel提供简单API,隐藏处理Excel文件的底层细节。
  • 注解支持:支持使用注解将Java对象映射到Excel列,便于Java对象和Excel数据之间进行转换。
  • 流式处理:采用流式处理的方式读取和写入大型 Excel 文件,能够有效处理大数据量。
  • 格式化:支持 Excel 的格式化特性,如单元格样式、字体、颜色、边框等。

官网:EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 官网

二、准备工作

开发环境: JDK8

编辑器:IDEA

数据库:MySQL

数据库工具:Navicat

其他工具:Maven

三、初始化项目

3.1 创建项目 

首先需要在IDEA开发工具中创建一个SpringBoot项目。

请修改以下属性

Name:自定义

Type:Maven

Group:com.自定义

随后一路Next就可以

3.2 引入依赖

 复制以下内容,粘贴到pom.xml文件中

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.1</version>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <version>8.0.31</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>4.0.1</version>
        </dependency>
    </dependencies>

3.3 创建数据库和数据表

创建一个名为excel_demo_db数据库,以及user数据表。

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

CREATE DATABASE `excel_demo_db`;
USE `excel_demo_db`;

DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) COLLATE utf8_bin DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

SET FOREIGN_KEY_CHECKS = 1;

 成功创建数据库和表后的数据结构如下:

 3.4 编写application.properties文件

# 配置数据库
spring.datasource.url=jdbc:mysql://localhost:3306/excel_demo_db?useSSL=false&serverTimezone=UTC
# 用户名
spring.datasource.username=你的数据库
# 密码
spring.datasource.password=你的密码
# 页面文件位置
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html

 四、开始编写

4.1 目录结构

4.2 MyBatis配置类

创建config包,在config 包下创建名为MyBatisConfig类,代码如下:

package com.saycode.demo.config;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;

@Configuration
@MapperScan("com.saycode.demo.mapper") // 扫描Mapper接口所在的包
public class MyBatisConfig {

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);

        Resource[] resources = new PathMatchingResourcePatternResolver()
                .getResources("classpath:mapper/*.xml");
        sessionFactory.setMapperLocations(resources);

        return sessionFactory.getObject();
    }
}

4.3 用户实体类

在entity包下创建User类,代码如下:

@ExcelProperty 便是EasyExcel 提供的注解,用于将 Java 对象的字段与 Excel 文件的列进行映射。

package com.saycode.demo.entity;

import com.alibaba.excel.annotation.ExcelProperty;

public class User {

    private Long id;

    @ExcelProperty("姓名")
    private String name;

    @ExcelProperty("年龄")
    private Integer age;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

 4.4 mapper接口

在mapper 包下创建UserMapper 接口,代码如下:

package com.saycode.demo.mapper;

import com.saycode.demo.entity.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;

import java.util.List;


public interface UserMapper {
    void insertUser(User user);

    List<User> getAllUsers();
}

4.5 编写数据操作文件

在resources 下创建mapper包,在mapper包中创建名为userMapper.xml的文件,用于编写sql语句。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.saycode.demo.mapper.UserMapper">
    <resultMap id="userResultMap" type="com.saycode.demo.entity.User">
        <id column="id" property="id" />
        <result column="name" property="name" />
        <result column="age" property="age" />
    </resultMap>

    <select id="getAllUsers" resultMap="userResultMap">
        SELECT * FROM users
    </select>

    <insert id="insertUser">
        INSERT INTO users (name, age) VALUES (#{name}, #{age})
    </insert>
</mapper>

resources 目录如下:

 4.6  编写Service 业务层

在service包下创建 UserService类,代码如下:

package com.saycode.demo.service;

import com.saycode.demo.entity.User;
import com.saycode.demo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public void insertUser(User user) {
        userMapper.insertUser(user);
    }

    public List<User> getAllUsers() {
        return userMapper.getAllUsers();
    }
}

 4.7 控制器层

在controller 下创建一个名为UserExcelListener的类,这是一个自定义的监听器类,用于处理 Excel 文件读取时的事件和逻辑。

以及创建一个UserController 类,处理用户的请求。代码如下:

UserExcelListener

package com.saycode.demo.controller;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.saycode.demo.entity.User;
import com.saycode.demo.service.UserService;

public class UserExcelListener extends AnalysisEventListener<User> {

    private UserService userService;

    public UserExcelListener(UserService userService) {
        this.userService = userService;
    }

    @Override
    public void invoke(User user, AnalysisContext analysisContext) {
        userService.insertUser(user);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    }
}

 UserController

package com.saycode.demo.controller;

import com.alibaba.excel.EasyExcel;
import com.saycode.demo.entity.User;
import com.saycode.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

@Controller
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/")
    public String index(Model model) {
        List<User> users = userService.getAllUsers();
        model.addAttribute("users", users);
        return "index";
    }

    @PostMapping("/upload")
    public String upload(MultipartFile file) {
        try {
            EasyExcel.read(file.getInputStream(), User.class, new UserExcelListener(userService)).sheet().doRead();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "redirect:/";
    }
}

4.8 编写主页面

在resources 下的 templates包中创建index.html文件,代码如下:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>用户列表信息</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 20px;
        }

        h1 {
            color: #333;
            text-align: center;
        }

        form {
            margin-bottom: 20px;
        }

        table {
            width: 80%;
            margin: 0 auto;
            border-collapse: collapse;
            border: 1px solid #ccc;
        }

        th, td {
            padding: 10px;
            text-align: left;
        }

        th {
            background-color: #f2f2f2;
        }

        tr:nth-child(even) {
            background-color: #f9f9f9;
        }

        input[type="file"] {
            margin-right: 10px;
        }

        button[type="submit"] {
            padding: 8px 16px;
            background-color: #4CAF50;
            color: white;
            border: none;
            cursor: pointer;
        }

        button[type="submit"]:hover {
            background-color: #45a049;
        }
    </style>
</head>
<body>
<h1>用户列表</h1>
<form action="#" th:action="@{/upload}" method="post" enctype="multipart/form-data">
    <input type="file" name="file" />
    <button type="submit">上传</button>
</form>
<table border="1">
    <tr>
        <th>姓名</th>
        <th>年龄</th>
    </tr>
    <tr th:each="user : ${users}">
        <td th:text="${user.name}"></td>
        <td th:text="${user.age}"></td>
    </tr>
</table>
</body>
</html>
</title>
</head>
<body>

</body>
</html>

五、运行

 在对应主程序类中,运行程序。

在浏览器中输入: localhost:8080 进行访问

 点击选择文件,选择excel文件。

文件格式如下:

序号姓名年龄
1张三20
2王五23

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

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

相关文章

静态链接——编译和链接

一、编译和链接的过程 1、GCC生成可执行文件的总体过程 在日常的开发过程中&#xff0c;IDE总是会帮我们将编译和链接合并&#xff0c;一键式的执行,即使在liunx中&#xff0c;使用命令行来编译一个源文件也只是简单的一句"gcc hello.c"。我们并没有过多的关注编译和…

linux的学习(五):shell编程中的变量,运算符,条件判断

简介&#xff1a; shell编程的基本概念&#xff0c;定义变量&#xff0c;运算符&#xff0c;条件判断的基本使用 shell编程 把多个命令写到一个文件里&#xff0c;这个文件就是脚本&#xff0c;里面还有很多的流程控制 基本概念 脚本的后缀名是.sh 脚本的执行&#xff1a;…

全面理解Spring6框架到熟悉与掌握

个人笔记梳理&#xff0c;仅供参考 Spring是一款主流的JavaEE轻量级开源框架 Spring的狭义和广义 广义的Spring&#xff1a;Spring技术栈 泛指以Spring Framework为核心的Spring技术栈 经过十多年的发展&#xff0c;Spring已经不再是一个单纯的应用框架&#xff0c;而是逐…

EasyAnimate-v3版本支持I2V及超长视频生成

阿里云人工智能平台&#xff08;PAI&#xff09;自研开源的视频生成项目EasyAnimate正式发布v3版本&#xff1a; 支持 图片&#xff08;可配合文字&#xff09; 生成视频 支持 上传两张图片作为起止画面 生成视频 最大支持720p&#xff08;960*960分辨率&#xff09; 144帧视…

量化投资基础(一)之均值方差模型一

点赞、关注&#xff0c;养成良好习惯 Life is short, U need Python 量化投资基础系列&#xff0c;不断更新中 1. 投资组合收益率与风险 假设市场有 N N N 个资产&#xff0c;其随机收益率分别为 R 1 , R 2 , … , R N R_1,R_2,\dots,R_N R1​,R2​,…,RN​ &#xff0c;对应…

蓝桥 双周赛算法赛【小白场】

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 蓝桥第14场小白入门赛T1/T2/T3 题目&#xff1a; T1照常还是送分题无需多…

【Git的基本操作】版本回退 | 撤销修改的三种情况 | 删除文件

目录 5.版本回退 5.1选项hard&后悔药 5.2后悔药&commit id 5.3版本回退的原理 6.撤销修改 6.1情况一 6.2情况二 6.3情况三 ​7.删除文件 Git重要能力之一马&#xff0c;版本回退功能。Git是版本控制系统&#xff0c;能够管理文件历史版本。本篇以ReadMe文件为…

STM32智能楼宇照明系统教程

目录 引言环境准备智能楼宇照明系统基础代码实现&#xff1a;实现智能楼宇照明系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;楼宇照明管理与优化问题解决方案与优化收尾与总结 1. 引言 智能楼宇照明系…

Vue3新特性:Teleport、Suspense玩转起来!

Vue3新特性&#xff1a;Teleport、Suspense玩转起来&#xff01; 嘿&#xff0c;各位前端小伙伴们&#xff01;今天咱们来聊聊Vue3中的两个新特性&#xff1a;Teleport和Suspense。这两个功能听起来像是从科幻电影里跑出来的&#xff0c;但实际上它们可是能让我们的代码更加优…

Leetcode - 周赛405

目录 一&#xff0c;3210. 找出加密后的字符串 二&#xff0c;3211. 生成不含相邻零的二进制字符串 三&#xff0c;3212. 统计 X 和 Y 频数相等的子矩阵数量 一&#xff0c;3210. 找出加密后的字符串 本题是一道模拟题&#xff0c;代码如下&#xff1a; class Solution {pu…

力扣27.移除元素(Java)

思路&#xff1a; 使用双指针&#xff0c;其中一个指针用来寻找不同val的下标&#xff0c;另一个指针用来赋值 class Solution {public int removeElement(int[] nums, int val) {int left0;//用来赋值的指针for(int right0;right<nums.length;right){//用来寻找不同与val…

[Linux]Linux编译器gcc/g++

首先我们需要明确概念gcc只能用来编译c语言&#xff0c;g即可用来编译c语言&#xff0c;又可用来编译c,但我们一般用gcc编译c,g编译c 一、gcc的使用 当我们写好代码以后可以直接 gcc test.c然后它会自动生成一个可执行程序a.out这个可执行程序的名字不重要&#xff0c;关键是…

醇香之旅:探索红酒的无穷魅力

在浩渺的饮品世界里&#xff0c;红酒如同一颗璀璨的星辰&#xff0c;闪烁着诱人的光芒。它以其不同的醇香和深邃的韵味&#xff0c;吸引着无数人的目光。今天&#xff0c;就让我们一起踏上这场醇香之旅&#xff0c;探索雷盛红酒所带来的无穷魅力。 一、初识红酒的醇香 当我们…

vue3前端页面下载excel模版

1.excel上传到public目录下 2.代码中引用excel路径 <el-space direction"horizontal" size"small"><el-button click"handleChangePage">刷新列表</el-button><el-button type"primary" click"handleBatch…

【第2章】Spring Cloud之Nacos服务端安装

文章目录 前言一、预备环境准备二、下载源码或者安装包1. 从 Github 上下载源码方式2.下载编译后压缩包方式(推荐)3. 目录结构4. 启动服务器5. 访问控制台6. 关闭服务器 总结 前言 Nacos 通过提供简单易用的动态服务发现、服务配置、服务共享与管理等服务基础设施&#xff0c;…

[日进斗金系列]用码上飞解决企微开发维修管理系统的需求

前言&#xff1a; 今天跟大家唠唠如何用小money生 大money的方法&#xff0c;首先我们需要准备一个工具。 这个工具叫码上飞CodeFlying&#xff0c;它是目前国内首发的L4级自动化智能软件开发平台。 它可以在短时间内&#xff0c;与AI进行几轮对话就能开发出一个可以解决实际…

【React打卡学习第一天】

React入门 一、简介二、基本使用1.引入相关js库2.babel.js的作用 二、创建虚拟DOM三、JSX&#xff08;JavaScript XML&#xff09;1.本质2.作用3.基本语法规则定义虚拟DOM时&#xff0c;不要写引号。标签中混入JS表达式时要用{}。样式的类名指定不要用class,要用className.内联…

发现一个巨牛的国产GPT,确定不来体验一下?

ChatGAI 这个网站融合了多种实用功能&#xff0c;包括聊天问答、PPT生成、笔记整理、图文创作和视频生成等&#xff0c;能满足媒体从业者的多元需求。用户无需注册即可体验&#xff0c;界面友好&#xff0c;操作便捷&#xff0c;分享给兄弟们使用。 链接&#xff1a;ChatGAI …

昇思25天学习打卡营第13天|munger85

文本解码原理–以MindNLP为例 重要的就是怎么样把数字最后转化成真正的文字。而且自回归模型它会一个字给一个字的预测&#xff0c;下一个字应该是什么&#xff1f; 如果这个模型下载很慢&#xff0c;你就可以通过这种方式从摩大社区进行下载。 这种方式&#xff0c; 每一次候…

LeetCode 142.环形链表2 C写法

LeetCOde 142.环形链表2 C写法 思路1&#x1f914;&#xff1a; ​ 用环形链表的方法&#xff0c;快慢指针找到slow和fast的相遇点&#xff0c;此时头到入口点的位置与相遇点到入口点的距离一样。 ​ 我们假设头到入口点的长度为L&#xff0c;环的长度为C&#xff0c;相遇点到入…