Excel一键导入导出-EasyPOI

EasyPOI是一款优秀的开源Java库,专为简化和优化Excel文件的导入导出操作而设计。下面,我会介绍EasyPOI在项目中使用EasyPOI,实现Excel文件的高效操作。帮助读者全面了解和掌握这一工具。

EasyPOI简介

官网:

http://www.wupaas.com/

开发指南:

http://doc.wupaas.com/docs/easypoi/easypoi-1c0u4mo8p4ro8

Gitee:

https://gitee.com/lemur/easypoi#https://gitee.com/link?target=http%3A%2F%2Fwww.wupaas.com%2F

EasyPOI的目标是做到比Apache POI简单,降低Excel导入导出时的复杂度。其主要特点如下:

  • 简洁的API:EasyPOI拥有更为简洁直观的API,使得操作Excel变得更加容易。
  • 注解驱动:使用注解来配置Excel映射,减少代码量,提高开发效率。
  • 模板导出支持:提供了丰富的模板导出功能,便于生成各种复杂的报表。
  • 强大的导入功能:支持大数据量的导入,且可以对导入数据进行校验。
  • 多样的数据处理:支持图片、公式、日期等多种类型的数据处理。

使用场景

  • 数据报表生成:可以快速生成企业内部的财务、销售等报表。
  • 数据汇总分析:对收集来的大量数据进行汇总和分析,生成可视化Excel报告。
  • 信息管理系统:在学生、员工等信息管理系统中,进行数据的快捷导入导出。

基础用法

环境准备

使用EasyPOI之前,需要将其作为依赖加入到你的项目中。如果你使用Maven,可以在pom.xml中加入如下依赖:

主依赖
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.2.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>4.2.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>4.2.0</version></dependency>
其他依赖
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- MyBatis --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version></dependency><!-- MySQL Connector --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>
数据库

Create TableCREATE TABLE `user` (`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '编号',`name` varchar(255) DEFAULT NULL COMMENT '姓名',`bir` timestamp NULL DEFAULT NULL COMMENT '出生日期',`photo` varchar(150) DEFAULT NULL COMMENT '头像',`habbys` varchar(100) DEFAULT NULL COMMENT '爱好',`cardno` varchar(18) DEFAULT NULL COMMENT '身份证号',`address` varchar(60) DEFAULT NULL COMMENT '住址',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
FieldTypeComment
主键idint(10) NOT NULL编号
namevarchar(255) NULL姓名
birtimestamp NULL出生日期
photovarchar(150) NULL头像
habbysvarchar(100) NULL爱好
cardnovarchar(18) NULL身份证号
addressvarchar(60) NULL住址
配置文件
mybatis.mapper-locations=classpath:mapper/*Mapper.xml
mybatis.type-aliases-package=com.yu.pojo
server.port=8081
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.password=root
spring.datasource.url=jdbc:mysql://localhost:3306/EasyPOI
spring.datasource.username=root
spring.thymeleaf.cache=false
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
数据模型
@Data
@ExcelTarget("users")
public class User implements Serializable {@Excel(name = "编号")private String id;@Excel(name = "姓名")private String name;@Excel(name = "生日", format = "yyyy年MM月dd日")private Date bir;@Excel(name = "头像信息", type = 2, savePath = "src/main/resources/static/images")private String photo;@Excel(name = "爱好", width = 12.0)private String habbys;@Excel(name = "身份证号", width = 15.0)private String cardno;@Excel(name = "家庭住址", width = 15.0)private String address;
}
DAO层
@Mapper
public interface UserMapper {//查询所有List<User> findAll();//插入记录void save(User user);
}
UserMapper.xml
<?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.yu.dao.UserMapper"><!--查询所有--><select id="findAll" resultType="User">select id,name,bir,photo,habbys,cardno,address from user</select><!--插入记录--><insert id="save" parameterType="User" useGeneratedKeys="true" keyProperty="id">insert into user values (#{id},#{name},#{bir},#{photo},#{habbys},#{cardno},#{address})</insert>
</mapper>
Service层接口
public interface UserService {List<User> findAll();//批量保存void saveAll(List<User> users);
}
Service层服务类
@Service
@Transactional
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Overridepublic List<User> findAll() {return userMapper.findAll();}@Overridepublic void saveAll(List<User> users) {users.forEach(user -> {user.setId(null);user.setPhoto(user.getPhoto().substring(user.getPhoto().lastIndexOf("\\") + 1));System.out.println(user.getPhoto());userMapper.save(user);});}
}
启动类
@SpringBootApplication
public class EasyPOIApplication {public static void main(String[] args) {SpringApplication.run(EasyPOIApplication.class, args);}
}
Thymeleaf
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>导入excel的主页面</title><style>body {font-family: Arial, sans-serif;background-color: #f5f5f5;}.container-fluid {max-width: 960px;margin: 0 auto;padding: 20px;}h1 {text-align: center;margin-bottom: 30px;}form {margin-bottom: 20px;}.form-group {display: flex;justify-content: center;align-items: center;}.form-control {margin-right: 10px;}table {width: 100%;border-collapse: collapse;}th, td {padding: 10px;text-align: left;border: 1px solid #ccc;}img {max-width: 60px;max-height: 60px;}.btn {display: inline-block;padding: 10px 20px;background-color: #007bff;color: #fff;text-decoration: none;border-radius: 4px;}.btn:hover {background-color: #0056b3;}</style>
<body>
<div class="container-fluid"><div class="row"><div class="col-md-12"><h1>选择Excel文件导入到数据中</h1><form th:action="@{/user/import}" method="post" enctype="multipart/form-data" class="form-inline"><div class="form-group"><input class="form-control" type="file" name="excelFile"><input type="submit" class="btn btn-danger" value="导入数据"></div></form></div><div class="col-md-12"><h1>显示导入数据列表</h1><table class="table table-bordered" ><tr><th>编号</th><th>头像</th><th>姓名</th><th>生日</th><th>爱好</th><th>身份证号</th><th>家庭住址</th></tr><tr th:each="user : ${users}"><td th:text="${user.id}"></td><td><img th:src="${'/images/'+ user.photo}" height="60px" alt=""></td><td th:text="${user.name}"></td><td th:text="${#dates.format(user.bir,'yyyy-MM-dd')}"></td><td th:text="${user.habbys}"></td><td th:text="${user.cardno}"></td><td th:text="${user.address}"></td></tr></table><hr><a th:href="@{/user/export}" class="btn btn-info">导出excel</a></div></div>
</div></body>
</html>
Controller层
@Controller
@RequestMapping("/user")
@Slf4j
public class UserController {@Autowiredprivate UserService userService;//查询所有@RequestMapping("/findAll")public String findAll(HttpServletRequest request){List<User> users = userService.findAll();request.setAttribute("users",users);return "index";}//导入excel@RequestMapping("/import")public String importExcel(MultipartFile excelFile) throws Exception {log.info("文件名称: [{}]",excelFile.getOriginalFilename());ImportParams params = new ImportParams();params.setTitleRows(1);//设置一级标题行为1行params.setHeadRows(1);//设置header标题为1行List<User> users;try (InputStream inputStream = excelFile.getInputStream()) {users = ExcelImportUtil.importExcel(inputStream, User.class, params);}log.info("导入总数为: [{}]", users.size());userService.saveAll(users);return "redirect:/user/findAll";}//导出excel@RequestMapping("/export")public void exportExcel(HttpServletResponse response, HttpServletRequest request) throws IOException {List<User> users = userService.findAll();users.forEach(user -> {try {Excel excelAnn = user.getClass().getDeclaredField("photo").getAnnotation(Excel.class);user.setPhoto(excelAnn.savePath()+'/'+user.getPhoto());} catch (NoSuchFieldException e) {e.printStackTrace();}});Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户列表", "用户信息"), User.class, users);response.setHeader("content-disposition","attachment;fileName="+ URLEncoder.encode("用户信息表.xls","UTF-8"));ServletOutputStream os = response.getOutputStream();workbook.write(os);os.close();workbook.close();}}

测试

Excel导入

导入之前

导入中

导入之后

Excel导出

Excel查看

项目结构

结语

EasyPOI提供了一套非常简单而强大的解决方案,用于处理Java中Excel的导入导出。它的易用性让开发人员可以更加关注业务逻辑,而不是被繁琐的数据处理细节所困扰。无论你是需要处理简单的数据列表,还是复杂的业务报表,EasyPOI都可以帮助你高效完成任务。


希望这篇博文能够帮助你开始使用EasyPOI来提升你的工作效率。当然,实际应用中,你还需要根据自己的具体场景去深入学习和掌握更多细节和技巧。

 

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

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

相关文章

串口通信知识点

串口的话主要就是用来进行通信的。 1>串行通信&#xff0c;并行通信。 串行通信&#xff1a;只使用一根线来进行数据发送或者是接收&#xff0c;串行通信传输数据是一位一位进行传输 并行通信&#xff1a;使用多跟线进行数据的发送和接收&#xff0c;并行通信可以一次传输…

windows服务启动

一.NetCore 1.创建启动脚本run_instal.bat,例如程序文件为ApiDoc.exe set serviceName"Apidoc Web 01" set serviceFilePath%~dp0ApiDoc.exe set serviceDescription"ApiDoc 动态接口服务 web 01"sc create %serviceName% BinPath%serviceFilePath% sc c…

如何在Django中使用分布式定时任务并结合消息队列

如何在Django中使用分布式定时任务并结合消息队列 如何在Django中使用分布式定时任务并结合消息队列项目背景与意义实现步骤1. 安装Celery和Django-celery-beat2. 配置Celery3. 配置Django-celery-beat4. 定义定时任务5. 启动Celery worker 和 beat6. Celery 指令7. 对接消息队…

SP1:基于Plonky3构建的zkVM

1. 引言 SP1为SuccictLab开源的&#xff0c;基于Plonky3构建的zkVM。 开源代码见&#xff1a; https://github.com/succinctlabs/sp1&#xff08;Rust&#xff09; 当前暂未实现onchain-verifier&#xff0c;但会采用标准的STARK->SNARK verifier。 SP1 zkVM基于的指令…

「软件设计师」操作系统基本原理

操作系统概述 操作系统与计算机体系结构之间的关系 操作系统具备的管理职能 进程管理 进程的状态前趋图pv操作死锁问题存储管理 段页式存储页面置换算法文件管理 索引文件位示图作业管理设备管理 数据传输控制方式微内核操作系统 虚设备与SPOOLING技术 进程管理 进程的状态…

数据库日志已经很大了,比如200多G,不能收缩到几兆,实际操作过只能到30G

当数据库日志文件&#xff08;通常称为事务日志或事务日志文件&#xff09;变得非常大时&#xff0c;确实可能会遇到问题&#xff0c;因为这会占用大量的磁盘空间&#xff0c;并可能影响数据库的性能。收缩日志文件到非常小的大小&#xff08;例如从200多G到几兆&#xff09;可…

UnityShader——02三大主流编程语言

三大主流编程语言 Shader Language Shader language的发展方向是设计出在便携性方面可以与C/JAVA相比的高级语言&#xff0c;“赋予程序员灵活而方便的编程方式”&#xff0c;并“利用图形硬件的并行性&#xff0c;提高算法的效率” Shader language目前主要有 3 种语言&…

Python OpenCV 入门 这篇就够了

目录 1.初步认识OpenCV 1.1OpenCv概述 1.2OpenCV模块 2.图像处理的基本操作 2.1 imread()方法读取图像 2.2 显示图像 2.2.1 imshow()方法显示图像 2.2.2 waitKey()方法设置按键事件 2.2.3 destroyAllWindows()方法销毁所有窗口 3.3 imwrite保存图像 3.4 获取图像属性…

springboot/ssm招投标系统Java在线招投标项目专家管理系统

springboot/ssm招投标系统Java在线招投标项目专家管理系统 开发语言&#xff1a;Java 框架&#xff1a;springboot&#xff08;可改ssm&#xff09; vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&am…

【OrangePi Zero2 智能家居】智能家居项目的软件实现

一、项目整体设计 二、项目代码的前期准备 三、实现语音监听接口 四、实现socket监听接口 五、实现烟雾报警监听接口 六、实现设备节点代码 七、实现接收消息处理接口 一、项目整体设计 整体的软件框架大致如下&#xff1a; 整个项目开启4个监听线程&#xff0c; 分别是&…

【洛谷 P3367】【模板】并查集 题解(并查集)

【模板】并查集 题目描述 如题&#xff0c;现在有一个并查集&#xff0c;你需要完成合并和查询操作。 输入格式 第一行包含两个整数 N , M N,M N,M ,表示共有 N N N 个元素和 M M M 个操作。 接下来 M M M 行&#xff0c;每行包含三个整数 Z i , X i , Y i Z_i,X_i,Y…

为什么有些人喜欢回答问题答非所问?为什么有些人的处事风格是热情、礼貌、一问三不知的人?

问题描述&#xff1a;为什么有些人喜欢回答问题答非所问&#xff1f;为什么有些人的处事风格是热情、礼貌、一问三不知的人&#xff1f; 问题解答&#xff1a; 有些人喜欢回答问题答非所问可能有几种原因&#xff1a; 缺乏知识或技能&#xff1a;有些人可能不了解问题的答案&…

奇异值分解(SVD)

对于一个方阵而言&#xff0c;采用的是特征分解&#xff0c;参考《矩阵特征值分解&#xff08;EVD&#xff09;-CSDN博客》

高程 | 数据的共享与保护(c++)

文章目录 &#x1f4da;标识符的作用域与可见性&#x1f407;作用域&#x1f407;可见性 &#x1f4da;对象的生存期&#x1f407;静态生存期&#x1f407;动态生存期 &#x1f4da;类的静态成员&#x1f407;静态数据成员&#x1f407;静态函数成员 &#x1f4da;类的友元&…

你的电脑关机吗

目录 程序员为什么不喜欢关电脑&#xff1f; 电脑长时间不关机会怎样? 电脑卡顿 中度风险 硬件损耗 能源浪费 散热问题 软件问题 网络安全问题 程序员为什么不喜欢关电脑&#xff1f; 大部分人都会选择将电脑进行关机操作。其实这不难理解&#xff0c;毕竟人类都需要…

MyBatis篇----第五篇

系列文章目录 文章目录 系列文章目录前言一、MyBatis 实现一对一有几种方式?具体怎么操作的?二、MyBatis 实现一对多有几种方式,怎么操作的?三、Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么?四、Mybatis 的一级、二级缓存前言 前些天发现了一个巨牛的人工智能…

每日一题 KY11 二叉树遍历

编一个程序&#xff0c;读入用户输入的一串先序遍历字符串&#xff0c;根据此字符串建立一个二叉树&#xff08;以指针方式存储&#xff09;。 例如如下的先序遍历字符串&#xff1a; ABC##DE#G##F### 其中“#”表示的是空格&#xff0c;空格字符代表空树。建立起此二叉树以后&…

【数据库_MySQL】MySQL彻底卸载

程序员为什么不喜欢关电脑&#xff1f; 你是否注意到&#xff0c;程序员们似乎从不关电脑&#xff1f;别以为他们是电脑上瘾&#xff0c;实则是有他们自己的原因&#xff01;让我们一起揭秘背后的原因&#xff0c;看看程序员们真正的“英雄”本色&#xff01; 卸载 要是你的…

【机器学习案例3】从科学论文图片中提取标题、作者和摘要【含源码】

在这个项目中,我的目标是从科学论文图片中提取某些部分(标题、作者和摘要)。预期提取部分是科学论文中常见的部分,例如标题、摘要和作者。输入与最终结果。我的输入是将第一页纸转换成图像。最终结果是一个 txt 文件,其中包含标题、作者和摘要部分,如下图1和图2所示。我将…

SpringBoot整合第三方技术-缓存

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…