快速在springboot项目中应用EasyExcel

目录

​编辑一、介绍

二、准备工作

三、初始化项目

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 {@Beanpublic 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 mapperPUBLIC "-//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 {@Autowiredprivate 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;}@Overridepublic void invoke(User user, AnalysisContext analysisContext) {userService.insertUser(user);}@Overridepublic 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 {@Autowiredprivate 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.mzph.cn/pingmian/46397.shtml

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

相关文章

【Linux】03.权限

一、权限的概念 Linux下有两种用户&#xff1a;超级用户&#xff08;root&#xff09;、普通用户。 超级用户&#xff1a;可以在 linux 系统下做任何事情&#xff0c;不受限制普通用户&#xff1a;在linux下做有限的事情超级用户的命令提示符是“#”&#xff0c;普通用户的命…

字节算法岗面试,效率贼高

最近这一两周看到不少互联网公司都已经开始秋招提前批了。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c;帮助一些球友…

python--实验 11 模块

目录 知识点 模块基础 模块使用方式 自定义模块示例 模块的有条件执行 Python包结构 定义和导入包 常用第三方库及安装 实例代码 第三方库自动安装脚本 Python标准库介绍 PyInstaller 小结 实验 1.(基础题)制作文本进度条。 2.(基础题) 蒙特卡罗方法计算圆周率…

[GXYCTF2019]BabySQli

原题目描述&#xff1a;刚学完sqli&#xff0c;我才知道万能口令这么危险&#xff0c;还好我进行了防护&#xff0c;还用md5哈希了密码&#xff01; 我看到是个黑盒先想着搞一份源码 我dirsearch明明扫到了.git&#xff0c;算了直接注入试试看 随便输入了两个东西&#xff0c…

Type-C PD芯片:引领充电技术的新纪元

随着科技的飞速发展&#xff0c;人们对电子设备的依赖日益加深&#xff0c;对充电速度、效率和安全性的要求也越来越高。在这样的背景下&#xff0c;Type-C PD&#xff08;Power Delivery&#xff09;芯片应运而生&#xff0c;以其高效、安全、智能的特点&#xff0c;成为了充电…

vscode编译环境配置-golang

1. 支持跳转 如果单测函数上方不显示run test | debug test&#xff0c;需要安装Code Debugger&#xff08;因为以前的go Test Explorer不再被维护了&#xff09; 2. 单测 指定单个用例测试 go test -v run TestXXXdlv 调试 需要安装匹配的go版本和delve版本&#xff08;如…

Linux多线程编程-生产者与消费者模型详解与实现(C语言)

1.什么是生成者与消费者模型 生产者-消费者模型是并发编程中的经典问题&#xff0c;描述了多个线程&#xff08;或进程&#xff09;如何安全、有效地共享有限的缓冲区资源。在这个模型中&#xff0c;有两种角色&#xff1a; 生产者&#xff08;Producer&#xff09;&#xff1…

<数据集>光伏板缺陷检测数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;2400张 标注数量(xml文件个数)&#xff1a;2400 标注数量(txt文件个数)&#xff1a;2400 标注类别数&#xff1a;4 标注类别名称&#xff1a;[Crack,Grid,Spot] 序号类别名称图片数框数1Crack8688922Grid8248843S…

研究生发表期刊/会议必看,一文看懂A/B/C类和顶刊

主要看&#xff1a;中国计算机学会&#xff08;CCF&#xff09;推荐国际学术期刊 里面的划分等级 等级为&#xff1a;A类&#xff08;最难&#xff09;>B类&#xff08;中等难度&#xff09;>C类&#xff08;难度一般&#xff09; 本人这边计划&#xff1a;最低发C刊&a…

css-grid布局(栅格布局)

css新世界-auto-fit grid 一个比flex更强大的布局,适合做整体布局 grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); auto-fit的话有strech效果gap 不仅可以用于grid 也可用flex. 在grid-template-areas表示这个位置空着grid area 的 [a b]命名可重复命名 表示的…

双向收发的信号应该在哪进行串联端接?分享几个实用设计方法!

高速先生成员--黄刚 经过上次高速先生的描述&#xff0c;相信大家已经掌握了串联端接的秘诀了&#xff0c;简单来说&#xff0c;那就是第一步&#xff1a;先看看芯片的驱动内阻&#xff0c;第二步&#xff1a;再用加起来50欧姆匹配的方法来选择适合的串阻值&#xff0c;第三步&…

【C语言报错已解决】格式化字符串漏洞(Format String Vulnerability)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言&#xff1a;一、问题描述&#xff1a;1.1 报错示例&#xff1a;1.2 报错分析&#xff1a;1.3 解决思路&#xff…

HEROIC FANTASY WERE CREATURES PACK VOL 2 (幻想生物)

这个包收集了5种英雄幻想生物:狼人,狼人,狼人山羊,狼人鲨鱼和狼人蜘蛛。 狼人:27.5 Ktris Max//101个骨骼//4种材质//最多4096*4096个纹理//40个动画(11个是根运动变体) 狼人:15.83 Ktris//66个骨骼//3种材质//最多4096*4096个纹理//35个动画(9个是根运动变体) wereg…

Centos 使用nfs配置共享目录使docker集群所有容器日志统一主机访问

Centos 使用nfs配置共享目录&#xff0c;使docker集群所有容器日志统一存放在主机一个共享目录下&#xff0c;供开发人员访问查看 准备两台或以上Centos服务器 192.168.0.1 nfs服务器 192.168.0.2 nfs客户端 以root用户登录192.168.0.1服务器&#xff0c;执行以下操作 注意先…

excel根据数据批量创建并重命名工作表

需求 根据一列数据&#xff0c;批量创建并重命名工作表 做法 1. 右键该sheet&#xff0c;选择查看代码 2. 输入VBA代码 正向创建 Sub create_sheets_by_col()Dim num% 定义为integer*num Application.WorksheetFunction.CountA(Sheet1.Range("A:A")) num是非空…

接着探索Linux的世界 -- 基本指令(文件查看、时间相关、打包压缩等等)

话不多说&#xff0c;直接进入主题 一、cat指令 -- 查看目标文件的内容 语法&#xff1a;cat [选项][文件] 功能&#xff1a; 查看目标文件的内容 -b 对非空输出行编号 -n 对输出的所有行编号 -s 不输出多行空行 1、查看目标文件的内容 2、 -b 对非空输出行编号 3、-n 对…

项目部署笔记

1、安全组需开放&#xff08;如果不开放配置nginx也访问不到&#xff09; 2、域名解析配置IP(子域名也需配置IP&#xff0c;IP地址可以不同) 3、如果出现图片获其他的文件找不到的情况请仔细检查一下路径是否正确 4、服务器nginx配置SSL证书后启动报错&#xff1a; nginx: […

巧用 VScode 网页版 IDE 搭建个人笔记知识库!

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 巧用 VScode 网页版 IDE 搭建个人笔记知识库! 描述&#xff1a;最近自己在腾讯云轻量云服务器中部署了一个使用在线 VScode 搭建部署的个人Markdown在线笔记&#xff0c;考虑到在线 VScode 支持终…

Day05-filebeat常用的输出组件,logstash的输入输出组件及date,grok,geoip过滤插件实战案例

Day05-filebeat常用的输出组件&#xff0c;logstash的输入输出组件及date&#xff0c;grok&#xff0c;geoip过滤插件实战案例 1、使用filebeat采集docker日志2、filebeat的input类型之filestream实战案例2.1 课堂练习案例2.2 将数据写入到本地文件案例2.3 写入数据到ES集群2.4…