快速在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,一经查实,立即删除!

相关文章

蓝牙串口通信:STM32F1系列与HC-05模块的连接

摘要 本文详细介绍了如何实现STM32F1系列微控制器与HC-05蓝牙模块的串口通信。通过本教程&#xff0c;读者将学习到硬件连接、软件配置和实际代码编写&#xff0c;为开发基于蓝牙的嵌入式项目打下基础。 1. 引言 在嵌入式系统中&#xff0c;无线通信是一个重要的功能。蓝牙作…

【Linux】03.权限

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

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

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

GPS北斗标准时钟同步服务器结构是什么?安徽京准

GPS北斗标准时钟同步服务器结构是什么&#xff1f;安徽京准 GPS北斗标准时钟同步服务器结构是什么&#xff1f;安徽京准 电厂时钟同步系统组成及配置 随着计算机和网络通信技术的飞速发展&#xff0c;火电厂热工自动化系统数字化、网络化的时代已经到来。一方面它为控制和信息系…

python--实验 11 模块

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

优化实战篇—自关联的优化

自关联的优化 根据定义&#xff0c;自关联是表自身的关联。自连接通常仅在给定数据中存在父子关系时使用。在本文中&#xff0c;我们将检查如何在Hive中编写自连接查询&#xff0c;它的性能问题以及如何优化它。开始之前我们可以看一下之前关于关联的文章 Hive实战之自关联经…

数据结构第28节 字典树

字典树&#xff08;Trie&#xff0c;也称前缀树&#xff09;是一种用于存储字符串的树形数据结构。它将字符串中的字符作为树的边&#xff0c;每个节点代表一个可能的前缀。字典树非常适合处理大量字符串的搜索、插入和删除操作&#xff0c;尤其是在查找具有相同前缀的字符串时…

[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;如…

Qt易错总结

一、编译相关 建议用qmake !!!,cmake坑点太多&#xff01;&#xff01;&#xff01; 1.自定义控件识别不了 cmakelist加上 include_directories(${PROJECT_SOURCE_DIR}/你自定义控件的相对路径) 2.添加模块&#xff08;以QCharts为例&#xff09; find_package(QT NAMES Q…

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;因此&#xff0c;分布式训练成为了解决这一问题的关键。在分布式训练中&#xff0c;数据并行是一种非常有效的策略&…

【JavaScript脚本宇宙】JavaScript图表库大比拼:从实时数据到时间表,一网打尽

数据可视化利器&#xff1a;探索六款流行JavaScript图表库 前言 在Web开发中&#xff0c;数据可视化是一个非常重要的领域。随着JavaScript图表库的不断涌现&#xff0c;开发人员可以更轻松地创建各种交互式和实时的图表。本文将介绍几种流行的JavaScript图表库&#xff0c;包…

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

高速先生成员--黄刚 经过上次高速先生的描述&#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…