EasyPoi实现简单的Excel导出、导入

EasyPoi实现Excel导出、导入
下面这种方式不需要模板,更加方便但是不能进行复杂的导出

一、引入依赖

<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.4.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>4.4.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>4.4.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.4.0</version></dependency>

二、数据准备

在这里插入图片描述

三、数据库数据导出到Excel

3.1 创建数据表对应的BO类

/**菜品*/
@Data
public class Dish implements Serializable {private static final long serialVersionUID = 1L;@Excel(name = "菜品ID", width = 20)   // 此注解标识的属性将被导出(该注解的各属性将在最后说明)@ExcelIgnore    //  此注解标识的属性将被忽略导出private Long id;//菜品名称@Excel(name = "菜品名称", width = 20)private String name;//菜品分类id@Excel(name = "菜品分类ID", width = 20)private Long categoryId;//菜品价格@Excel(name = "菜品价格", width = 20)private BigDecimal price;//商品码@Excel(name = "商品码", width = 20)private String code;//图片@Excel(name = "菜品图片", width = 20)private String image;//描述信息@Excel(name = "描述信息", width = 20)private String description;//0 停售 1 起售private Integer status;//顺序private Integer sort;@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;@TableField(fill = FieldFill.INSERT)private Long createUser;@TableField(fill = FieldFill.INSERT_UPDATE)private Long updateUser;//是否删除private Integer isDeleted;}

3.2 数据访问层实现

@Mapper
public interface DishDAO {List<Dish> selectAllDish();
}
<?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.wyw.learn.excel.DishDAO"><select id="selectAllDish" resultType="com.wyw.learn.excel.Dish">select id,name,category_id as categoryId,price,code,image,description,status,sort,create_time as createTime,update_time as updateTime,create_user as createUser,update_user as updateUser,is_deleted as isDeletedfrom dish;</select>
</mapper>

3.3 业务逻辑层实现(关键导出逻辑)

/*** @author name:    silk* @version 1.0* @description: TODO* @date 2024/4/16 15:16*/
@Service
public class DishService {@Autowiredprivate DishDAO dishDAO;/**** @description: 测试导出数据至Excel* @param:* @return:* @author name silk* @date: 2024/4/16 15:01*/public void testDishExportExcel() throws Exception {// 1. 查询数据库所有的菜品信息List<Dish> dishList = dishDAO.selectAllDish();// 2. 构造工作簿SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");// ExportParams有多个构造器,根据需要选择用哪个// "菜品信息表"是第1个表头名称,df.format(new Date())是第2个表头名称,"sheet1"是当前sheet名称ExportParams exportParams = new ExportParams("菜品信息表", df.format(new Date()), "sheet1");// 注意ExcelExportUtil工具类并不完美,可能还需要针对具体需求进一步完善Workbook workbook = ExcelExportUtil.exportExcel(exportParams, Dish.class, dishList);// 3. 构造文件输出流,输出excelFileOutputStream os = new FileOutputStream("E:/" + "testExportExcel-" + df.format(new Date()) + ".xlsx");workbook.write(os); // 将工作簿写出os.flush(); // 强制把缓冲区中的数据发送到目的地,确保数据的及时性os.close(); // 关闭流}
}

3.4 导出结果

查看Excel可知,仅导出了被@Excel标识的属性,对应的列名称就是配置的name值;
关于@Excel其他属性,在下面第五节中说明;
在这里插入图片描述
在这里插入图片描述

四、读取Excel数据至数据库表

4.1 BO类复用上述Dish类

4.2 数据访问层省略

因为我们的Excel是从该数据库表中导出的,为了避免再次插入相同的数据,导致数据库报错,在此仅将Excel读取到List中,接口返回该List即可,不再写表;

4.3 业务逻辑层(关键读取逻辑)

/*** @author name:    silk* @version 1.0* @description: TODO* @date 2024/4/16 15:16*/
@Service
public class DishService {@Autowiredprivate DishDAO dishDAO;/**** @description: 测试读取Excel数据* @param:* @return:* @author name silk* @date: 2024/4/17 10:05*/public List<Dish> testDishImportExcel() throws Exception {List<Dish> res = new ArrayList<>();// 1. 构建文件输入流SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");FileInputStream fileInputStream = new FileInputStream("E:/" + "testExportExcel-" + df.format(new Date()) + ".xlsx");// 2. 构造工作簿,逐行逐列读取数据XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream);// 获取工作簿sheet1中的所有数据XSSFSheet sheet1 = workbook.getSheet("sheet1");// 排除表头信息,逐行读取int lastRowNum = sheet1.getLastRowNum();if (lastRowNum <= 2) {System.out.println("Excel表有效数据为空,请重新导入!");throw new Exception("Excel表有效数据为空,请重新导入!");}for (int i = 3; i < lastRowNum; i++) {//行数据XSSFRow row = sheet1.getRow(i);if (ObjectUtil.isEmpty(row)) {continue;}Dish dish = new Dish();// 6列数据类型,(菜品名称 菜品分类ID 菜品价格 商品码 菜品图片 描述信息)// 该行的第1个元素 菜品名称XSSFCell name = row.getCell(0);	if (ObjectUtil.isEmpty(name) || StrUtil.isEmpty(name.toString())) {continue;}dish.setName(name.toString());// 该行的第2个元素 菜品分类IDXSSFCell categoryId = row.getCell(1);if (ObjectUtil.isEmpty(categoryId) || StrUtil.isEmpty(categoryId.toString())) {continue;}dish.setCategoryId(Long.parseLong(categoryId.toString()));XSSFCell price = row.getCell(2);if (ObjectUtil.isEmpty(price) || StrUtil.isEmpty(price.toString())) {continue;}// 需要注意数据类型转换,转换成适配的数据类型dish.setPrice(BigDecimal.valueOf(Double.parseDouble(price.toString())));XSSFCell code = row.getCell(3);if (ObjectUtil.isEmpty(code) || StrUtil.isEmpty(code.toString())) {continue;}dish.setCode(code.toString());XSSFCell image = row.getCell(4);if (ObjectUtil.isEmpty(image) || StrUtil.isEmpty(image.toString())) {continue;}dish.setImage(categoryId.toString());XSSFCell description = row.getCell(5);if (ObjectUtil.isEmpty(description) || StrUtil.isEmpty(description.toString())) {continue;}dish.setDescription(description.toString());// 3. 数据添加至返回结果List,接口将该List返回做展示res.add(dish);}return res;}
}

4.4 读取结果

在这里插入图片描述

五、@Excel注解属性【参考博客】

EasyPoi的@Excel注解具有多个属性,下表总结了这些属性及其作用。
请注意,随着EasyPoi版本的更新,可能会有新的属性加入或旧的属性被修改,以下信息基于EasyPoi的一个特定版本,可能不涵盖所有的属性和最新的变动。
在这里插入图片描述

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

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

相关文章

2024商业地产五一劳动节健康大会朋克养生市集活动策划方案

2024商业地产五一劳动节健康大会朋克养生市集&#xff08;带薪健康 快乐打工主题&#xff09;活动策划方案 活动策划信息&#xff1a; 方案页码&#xff1a;53页 文件格式&#xff1a;PPT 方案简介&#xff1a; 打工不养生 赚钱养医生 期待已久的五一假期&#xff0c; …

mysql download 2024

好久没在官网下载 mysql server 安装包。今天想下载发现&#xff1a; 我访问mysql官网的速度好慢啊。mysql server 的下载页面在哪里啊&#xff0c;一下两下找不到。 最后&#xff0c;慢慢悠悠终于找到了下载页面&#xff0c;如下&#xff1a; https://dev.mysql.com/downlo…

什么是全局特征,什么又是局部特征

全局特征和局部特征是用来描述数据中信息的两种不同方式&#xff0c;特别是在图像处理、模式识别和机器学习领域中经常被提到。它们有助于理解和分析数据的不同层面&#xff1a; 全局特征&#xff08;Global Features&#xff09; 全局特征描述了整个数据集的整体属性。在图像…

windows和linux服务器等保测评加固方法

服务器加固是通过各种方法增强服务器安全性的过程。保护操作系统免受黑客、破解者和攻击者的侵害。网络安全防护的目标是保密性、完整性、可用性、可控制性、不可否认性。 一、window服务器等保加固 以win2012和win2008 为例&#xff1a; &#xff08;win2008&#xff09; …

【UML建模】用例图

1 参与者 参与者的概念&#xff1a; 指系统以外的、需要使用系统或与系统交互的外部实体 可以分为&#xff1a;人、外部设备、外部系统 参与者的图形符号&#xff1a; 例 3.1 在一个银行业务系统中&#xff0c;可能会有以下参与者 客户 &#xff1a;在银行业务系统中办理…

React【Day2】

React表单控制 受控绑定 概念&#xff1a;使用React组件的状态&#xff08;useState&#xff09;控制表单的状态 双向绑定 MVVM 报错记录&#xff1a; 错误代码&#xff1a; import { useState } from "react";const App () > {const [value, setValue] useS…

TLV61048非同步升压BOOST转换器输入电压2.6-5.5V输出电流4A输出电压最高15V

推荐原因&#xff1a; 输入电压较低&#xff0c;输出电流可达3.5A SOT23-6封装 批量价格约0.70元 TLV61048引脚 TLV61048引脚功能 7 详细说明 7.1 概述 TLV61048是一款非同步升压转换器&#xff0c;支持高达 15 V 的输出电压和输入范围从 2.61 V 到 5.5 V。该TLV61048集成了…

LlamaIndex 加 Ollama 实现 Agent

AI Agent 是 AIGC 落地实现的场景之一&#xff0c;与 RAG 不同&#xff0c;RAG 是对数据的扩充&#xff0c;是模型可以学习到新数据或者本地私有数据。AI Agent 是自己推理&#xff0c;自己做&#xff0c;例如你对 AI Agent 说我要知道今天上海的天气怎么样&#xff0c;由于 AI…

serverLess

第一步 安装依赖 npm install serverless-devs/s g 第二步 配置秘钥&#xff1a; 第三步 执行终端 执行命令 s config add 选择 alibaba cloud &#xff08;alibaba&#xff09; 把对应的ID secret填写&#xff0c;第三个别名可以随便写&#xff1a; serverLess 查看是…

Kettle的安装及简单使用

Kettle的安装及简单使用 文章目录 Kettle的安装及简单使用一、kettle概述二、kettle安装部署和使用Windows下安装&#xff08; 1 &#xff09;概述 案例 1 &#xff1a;MySQL to MySQL主界面&#xff1a;**在kettle中新建转换--->输入--->表输入-->表输入双击**建立连…

js进行数据移除性能比较(splice,map)

当使用 splice() 方法处理大量数据时&#xff0c;确实会遇到性能问题&#xff0c;因为它涉及到移动数组中的元素&#xff0c;导致操作的时间复杂度为 O(n)。对于大量数据&#xff0c;频繁的插入和删除可能会导致性能下降。 1、设置数组数据为10000&#xff0c;使用splice移除数…

软件项目经理需要具备这 11 个能力

当前软件开发技术更新换代越来越快&#xff0c;各种项目实施管理思想也日新月异&#xff0c;作为一个软件项目经理&#xff0c;需要具备这 11 种能力&#xff1a; 1. 项目管理能力 了解项目管理的基本原则和方法&#xff0c;包括制定项目计划、资源分配、风险管理、问题解决和…

Python练习03

题目 解题思路 Demo58 通过字符串切片来进行反转操作 def _reverse():"""这是一个反转整数的函数"""num input("请输入想要反转的整数")print(num[::-1]) 运行结果 Demo61 首先制作一个判断边长的函数&#xff0c;通过三角形两边…

4.23学习总结

一.NIO(一) (一).简介: NIO 是 Java SE 1.4 引入的一组新的 I/O 相关的 API&#xff0c;它提供了非阻塞式 I/O、选择器、通道、缓冲区等新的概念和机制。相比与传统的 I/O 多出的 N 不是单纯的 New&#xff0c;更多的是代表了 Non-blocking 非阻塞&#xff0c;NIO具有更高的并…

【Linux高性能服务器编程】两种高性能并发模式剖析——半同步/半异步模式

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的Linux高性能服务器编程系列之两种高性能并发模式介绍&#xff0c;在这篇文章中&#xff0c;你将会学习到高效的创建自己的高性能服务器&#xff0c;并且我会给出源码进行剖析&#xff0c;以及手绘UML图来帮助大家来理解…

《HCIP-openEuler实验指导手册》1.4 Apache MPM工作模式调整

MPM介绍 二、配置步骤 查看MPM当前工作模式 方法一&#xff1a; httpd -M | grep mpm方法二&#xff1a; 浏览器访问&#xff1a;http://IP:端口/server-status 方法三&#xff1a; cat /etc/httpd/conf.modules.d/00-mpm.conf查看 LoadModule mpm_event_module modules/mo…

Iterator 迭代器

意图 提供一个方法顺序访问一个聚合对象中的各个元素&#xff0c;且不需要暴漏该对象的内部表示。 结构 Iterator&#xff08;迭代器&#xff09;定义访问和遍历元素的接口。ConcreteIterator&#xff08;具体迭代器&#xff09;实现迭代器接口&#xff1b;对该聚合遍历是跟踪…

DSSM 模型技术介绍

转自&#xff1a;git 本文属于新闻推荐实战-召回阶段-DSSM召回模型。区别于策略召回&#xff0c;基于向量召回也是目前工业界常用的一种召回方法。这里我们将介绍一个比较经典的召回模型DSSM&#xff0c;希望读者可以快速掌握模型原理以及细节&#xff0c;同时可以了解具体的实…

Nacos原理简单介绍

注册中心原理 官网&#xff1a;Nacos 注册中心的设计原理 | Nacos nacos注册中心采用了 &#xff1a;pull &#xff08;客户端的轮询&#xff09;和push &#xff08;服务端主动push&#xff09;策略 客户端启动时会将当前服务的信息包含ip、端口号、服务名、集群名等信息封装…

电脑问题快速判断

电脑开机没有任何反应 检查电源 检查电源是否有问题或损坏&#xff0c;可以短接方法检测 板电源卡口对自己接第四或第五根线&#xff0c;若风扇匀速转动&#xff0c;电源无问题&#xff0c;若不转动或转一下停一下&#xff0c;电源有问题 检查内部连线 确保主板上的线插的…