EsayExcel文件导入导出

目录

准备工作

监听器类

导入测试

导出测试

上传Excel

下载Excel

混合导出+模板导出


headRowNumber(1):从第几行开始读

准备工作

导入依赖

<!--easyexcel-->
<dependency><groupId>com.alibaba</groupId>x<artifactId>easyexcel</artifactId><version>2.2.6</version>
</dependency>
<!--文件上传-->
<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version>
</dependency>

创建实体类

@HeadRowHeight():设置导出的Excle表格标题的行高

@ExcelProperty():对当前列的操作

value:设置列的名字

value = {"value1","value2"}:一级标题,二级标题

index = 2:这个字段放在第几列,默认从0开始

@ExcelIgnore:不导入导出这个字段

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("user")
@HeadRowHeight(30)  // 标题行高
public class User {/*** @ExcelProperty*      value:列名称*      index:写:写内容到第几列,读:第几列的内容放到这个字段*      {}:给头在加一个头,所有都加,就会合并** @ExcelIgnore*      导入或导出时候,不要这个字段**/@TableId(value = "id", type = IdType.AUTO)@ExcelProperty(value = {"用户信息表","ID"},index = 5)@ExcelIgnoreprivate Integer id;@ExcelProperty(value = {"用户信息表","姓名"},index = 1)@ColumnWidth(20)private String name;@ExcelProperty(value = {"用户信息表","年龄"},index = 2)private Integer age;@ExcelProperty(value = {"用户信息表","性别"},index = 3)private Integer sex;@ExcelProperty(value = {"用户信息表","日期"},index = 4)@ColumnWidth(20)private Date dateTime;}

第二个实体类

package com.zsh.esayexcel.domain.po;@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserVO {private Integer sum;private Integer avg;
}

Mapper

package com.zsh.esayexcel.mapper;/*** <p>*  Mapper 接口* </p>** @author KaiLangJiaoJiao* @since 2024-02-12*/
@Mapper
public interface UserMapper extends BaseMapper<User> {}

Service

package com.zsh.esayexcel.service;/*** <p>*  服务类* </p>** @author KaiLangJiaoJiao* @since 2024-02-12*/
public interface IUserService extends IService<User> {}

ServiceImpl

package com.zsh.esayexcel.service.impl;/*** <p>*  服务实现类* </p>** @author KaiLangJiaoJiao* @since 2024-02-12*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {}

Controller

package com.zsh.esayexcel.controller;/*** <p>*  前端控制器* </p>** @author KaiLangJiaoJiao* @since 2024-02-12*/
@RestController
@RequestMapping("/user")
public class UserController {}

监听器类

创建listener包

UserListener

package com.zsh.esayexcel.listener;/*** 读取文档的监听器类*/
public class UserListener extends AnalysisEventListener<User> {/*** 读监听器,每读一行内容,都会调用一次该对象的invoke,在invoke可以操作使用读取到的数据* @param user* @param analysisContext*/@Overridepublic void invoke(User user, AnalysisContext analysisContext) {System.out.println("user = " + user);}/*** 读取完整个文档之后调用的方法* @param analysisContext*/@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {}
}

WebUserListener

package com.zsh.esayexcel.listener;@Scope("prototype") // 官方要求,这个类需要是多例对象,不能是单例
public class WebUserListener extends AnalysisEventListener<User> {//    @Autowired
//    private IUserService userService;List<User> userList = new ArrayList<>();@Overridepublic void invoke(User user, AnalysisContext analysisContext) {userList.add(user);// 判断条数为5时添加一次if (userList.size() % 5 == 0) {IUserService userService = new UserServiceImpl();// 添加userService.saveBatch(userList);// 添加完清空数组userList.clear();}}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {// 剩下数据不足5条时添加if (userList.size() != 0) {IUserService userService = new UserServiceImpl();// 添加userService.saveBatch(userList);// 添加完清空数组userList.clear();}}
}

导入测试

这是一个Test测试类

package com.zsh.esayexcel;@SpringBootTest
public class ExcelTest {/*** 读excel*/@Testpublic void test(){/*** pathName:要读取的文件路径** head:文件中每一行数据要存储到的实体类行的class** readListener:读监听器,每读一行内容,都会调用一次该对象的invoke,在invoke可以操作使用读取到的数据*/// 获得一个工作簿对象ExcelReaderBuilder readWorkBook = EasyExcel.read("C:\\Users\\开朗觉觉\\Desktop\\用户表.xlsx", User.class, new UserListener());// 获得工作簿对象ExcelReaderSheetBuilder sheet = readWorkBook.sheet();/*** headRowNumber()* 从第几行开始读,默认是1*/// 读取工作表中内容sheet.headRowNumber(1).doRead();}}

导出测试

这是一个测试类

package com.zsh.esayexcel;@SpringBootTest
public class ExcelTest {/*** 写excel*/@Testpublic void test2(){// 工作簿对象// .xml会直接放到Module里ExcelWriterBuilder writeWorkBook = EasyExcel.write("学生表的写操作.xlsx", User.class);	// 工作表对象ExcelWriterSheetBuilder sheet = writeWorkBook.sheet();// 准备数据List<User> userList = new ArrayList<>();for (int i = 0; i < 5; i++) {User user = new User(i,"张三"+i,10,2,new Date());userList.add(user);}// 写sheet.doWrite(userList);}}

上传Excel

package com.zsh.esayexcel.controller;/*** <p>*  前端控制器* </p>** @author KaiLangJiaoJiao* @since 2024-02-12*/
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate IUserService userService;/*** 测试* @return*/@GetMapping("/test")private String test(){return "ok";}/*** Excel导入* @param uploadExcel* @return*/@PostMapping("/read")public String readExcel(@RequestBody MultipartFile uploadExcel){try {// 工作簿ExcelReaderBuilder readWorkBook = EasyExcel.read(uploadExcel.getInputStream(), User.class, new WebUserListener());// 工作表ExcelReaderSheetBuilder sheet = readWorkBook.sheet();// 读sheet.doRead();return "success";} catch (IOException e) {e.printStackTrace();return "fail";}}}

下载Excel

package com.zsh.esayexcel.controller;/*** <p>*  前端控制器* </p>** @author KaiLangJiaoJiao* @since 2024-02-12*/
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate IUserService userService;/*** Excel导出* @param response*/@GetMapping("/write")@ResponseBodypublic void writeExcel(HttpServletResponse response) throws IOException {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 防止中文乱码String fileName = URLEncoder.encode("学生表测试", "UTF-8");response.setHeader("Content-Disposition","attachment; filename*=UTF-8''" + fileName + ".xlsx");// 收集要写的数据装进一个工作簿中ServletOutputStream outputStream = response.getOutputStream();// 获取工作簿ExcelWriterBuilder writeWrokBook = EasyExcel.write(outputStream, User.class);// 获取工作表ExcelWriterSheetBuilder sheet = writeWrokBook.sheet();// 获取数据List<User> userList = userService.list(null);// 写sheet.doWrite(userList);}}

混合导出+模板导出

模板设计

{.xxxx}:填充多行

{xxxx}:填充单行

代码开发

package com.zsh.esayexcel;@SpringBootTest
public class ExcelTest {@Autowiredprivate IUserService userService;/*** 混合导出*/@Testpublic void test3(){// 准备模板String tempalte = "用户表模板.xlsx";/*** withTemplate()*      使用模板创建表*/// 创建一个工作簿对象ExcelWriter workBook = EasyExcel.write("用户信息表.xlsx", User.class).withTemplate(tempalte).build();// 创建工作表对象WriteSheet sheet = EasyExcel.writerSheet().build();// 准备数据
//        IUserService userService = new UserServiceImpl();List<User> userList = userService.list(null);UserVO userVO = new UserVO();// 总人数userVO.setSum(userList.size());// 年龄总和Integer agesum = userList.stream().map(user -> user.getAge()).reduce(0, (result, element) -> result + element);// 平均年龄userVO.setAvg(agesum / userList.size());// 数据填充FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();// 因为多组填充的数据不确定,需要在多组数据填充完之后另起一行// 多组填充workBook.fill(userList,fillConfig,sheet);// 单组填充workBook.fill(userVO,sheet);// 关闭流workBook.finish();}}

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

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

相关文章

小白水平理解面试经典题目LeetCode 102 Binary Tree Level Order Traversal【二叉树】

102. 二叉树层次顺序遍历 小白渣翻译 给定二叉树的 root &#xff0c;返回其节点值的层序遍历。 &#xff08;即从左到右&#xff0c;逐级&#xff09;。 例子 小白教室做题 在大学某个自习的下午&#xff0c;小白坐在教室看到这道题。想想自己曾经和白月光做题&#xff0c…

Spring Boot 笔记 017 创建接口_新增文章

1.1实体类增加校验注释 1.1.1 自定义校验 1.1.1.1 自定义注解 package com.geji.anno;import com.geji.validation.StateValidation; import jakarta.validation.Constraint; import jakarta.validation.Payload; import jakarta.validation.constraints.NotEmpty;import jav…

vuex中Actions详解,代码示例

Vuex 中的 Actions 是用于触发mutations 的一种方式&#xff0c;它可以包含异步操作&#xff0c;并通过提交(commit)mutations 来改变 store 的状态。以下是 Actions 的详细介绍、使用步骤和示例代码&#xff1a; Actions 的介绍&#xff1a; Actions 是 Vuex 中的一个重要概…

Hive的相关概念——架构、数据存储、读写文件机制

目录 一、架构及组件介绍 1.1 Hive整体架构 1.2 Hive组件 1.3 Hive数据模型&#xff08;Data Model&#xff09; 1.3.1 Databases 1.3.2 Tables 1.3.3 Partitions 1.3.4 Buckets 二、Hive读写文件机制 2.1 SerDe 作用 2.2 Hive读写文件流程 2.2.1 读取文件的过程 …

Java微服务学习Day2

文章目录 Nacos配置管理统一配置管理配置热更新![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c8a2d17baeef411980b44b432eb9692a.png)配置共享搭建Nacos集群 Feign远程调用介绍自定义配置性能优化最佳实践 Gateway服务网关介绍搭建网关服务路由断言工厂路由过滤器…

CTFshow web(文件上传151-154)

web151 哈&#xff0c;都直接送嘴边了&#xff0c;前端检测领域的问题&#xff0c;那就改前端啊&#xff0c;作者都直接提示了&#xff01; 第一种方法也是最好用的就是直接把前端内容的png改成php就好 这里教大家一个非常好用的技巧&#xff0c;可以极大节省你的时间&#xf…

单片机学习路线(简单介绍)

学习单片机对于电子爱好者和未来的嵌入式系统工程师来说是一段激动人心的旅程。单片机因其强大的功能、灵活性以及在各种智能设备中的广泛应用&#xff0c;成为了电子和计算机科学领域一个不可或缺的组成部分。如果你对如何开始这段旅程感到好奇&#xff0c;那么你来对地方了。…

Java的接口

目录 1.接口的概念 2.语法规则 3.接口的使用 4.接口的特性 总结&#xff1a; 5.实现多个接口 6.接口间的继承 1.接口的概念 接口就是公共的行为规范标准&#xff0c;大家在实现时&#xff0c;只要符合规范标准&#xff0c;就可以通用。 在Java中&#xff0c;接口可以看成…

统计图饼图绘制方法(C语言)

统计图饼图绘制方法&#xff08;C语言&#xff09; 常用的统计图有条形图、柱形图、折线图、曲线图、饼图、环形图、扇形图。 前几类图比较容易绘制&#xff0c;饼图绘制较难。今值此介绍饼图的绘制方法。 本方法采用C语言的最基本功能&#xff1a; &#xff08; 1.&#xff09…

Pytorch+NCCL源码编译

目录 环境1. 安装cudnn2. 使用pytorch自带NCCL库进行编译3. 修改NCCL源代码并重新编译后测试&#xff0c;体现出源码更改 环境 Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-91-generic x86_64)cuda 11.8 cudnn 8python 3.10torch V2.0.1 nccl 2.14.3NVIDIA GeForce RTX 4090 *2 1.…

基于BitVM的乐观 BTC bridge

1. 引言 前序博客&#xff1a; 区块链互操作协议Bitcoin Bridge&#xff1a;治愈还是诅咒&#xff1f;BitVM&#xff1a;Bitcoin的链下合约 基于BitVM的乐观 BTC bridge&#xff1a; Trust-minimized two-way peg 机制 BitVM BTC bridge背后的主要思想是&#xff1a; 为比…

538. 把二叉搜索树转换为累加树

给出二叉 搜索 树的根节点&#xff0c;该树的节点值各不相同&#xff0c;请你将其转换为累加树&#xff08;Greater Sum Tree&#xff09;&#xff0c;使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下&#xff0c;二叉搜索树满足下列约束条件&#…

bugku 2

社工-初步收集 购买辅助--下载辅助 得到一个zip文件 里面有exe 不知道有啥用 先用dirsearch扫一下 找到/admin/login.php 随便用了个弱口令登录失败 后面看了要用wireshrak抓包 找到邮箱和pass 把pass解码 本来以为后台直接登录 但是登录失败 就是要用邮箱登录 找到账…

[NISACTF 2022]easyssrf

它提示我们输入 那我们输入file:///flag file:// 访问本地文件系统 它提醒我们输file:///fl4g 它提醒我们输ha1x1ux1u.php 看到代码stristr($file, “file”)当我们输入file它会提示我们输了 啥意思可以前面加个/ 也可以通过read读取 思路都是前面加/不等于flag绕过 filephp://…

Rust 格式化输出

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、format! 宏二、fmt::Debug三、fmt::Display四、? 操作符 循环打印 前言 Rust学习系列-本文根据教程学习Rust的格式化输出&#xff0c;包括fmt::Debug&…

[NSSCTF]-Web:[SWPUCTF 2021 新生赛]easyrce解析

先看网页 代码审计&#xff1a; error_reporting(0); &#xff1a;关闭报错&#xff0c;代码的错误将不会显示 highlight_file(__FILE__); &#xff1a;将当前文件的源代码显示出来 eval($_GET[url]); &#xff1a;将url的值作为php代码执行 解题&#xff1a; 题目既然允许…

【白话前端】快速区分webGL,webGPU,unity3D和UE4

在3D图形渲染的渲染领域&#xff0c;很多友友们对上述概念傻傻分不清&#xff0c;站在前端开发角度&#xff0c;我用简单语言说下&#xff0c;结论在文章最后。 一、四者都能进行3D图形渲染 它们之间有一些区别&#xff0c;下面我将对它们进行简单的区分&#xff1a; WebGPU&a…

HTTP网络通信协议基础

目录 前言&#xff1a; 1.HTTP协议理论 1.1协议概念 1.2工作原理 1.3工作场景 2.HTTP抓包工具 2.1Fiddler工具 2.2抓包原理 2.3抓包结果 3.HTTP协议格式 3.1HTTP请求 3.2HTTP响应 3.3格式总结 前言&#xff1a; 在了解完网络编程的传输层UDP和TCP通信协议后&#…

相机图像质量研究(7)常见问题总结:光学结构对成像的影响--镜片固化

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

Ubuntu Linux使用PL2302串口和minicom进行开发板调试

调试远程的服务器上面的BMC&#xff0c;服务器上面安装了Ubuntu&#xff0c;想着可以在服务器接个串口到BMC&#xff0c;然后SSH到服务器的Ubuntu&#xff0c;用minicom来查看串口信息。 准备&#xff1a; 服务器Ubuntu安装mimicom 本机可以ssh到Ubuntu 串口工具PL2302 或者CH3…