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.mzph.cn/news/682289.shtml

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

相关文章

QTabWidget和QTabBar控件样式设置(qss)

QTabWidget和QTabBar控件样式设置 1、QTabWidget样式可自定义的有哪些示例&#xff1a;效果图 2、QTabBar样式可自定义的有哪些示例效果图 1、QTabWidget样式可自定义的有哪些 QTabWidget::pane{} 定义tabWidgetFrameQTabWidget::tab-bar{} 定义TabBar的位置QTabWidget::tab{}定…

简单的手指控制机械臂

跟之前的那个项目类似, 使用mediapipe, 拿到手指的位置, 来控制舵机, 从而控制一个机械臂. 直接上代码: """ 演示一个简单的虚拟拖拽 步骤&#xff1a; 1、opencv 读取视频流"""# 导入opencv import cv2 import numpy as np import math impor…

c++STL系列——(八)multiset

在C的标准模板库&#xff08;STL&#xff09;中&#xff0c;multiset是一个非常有用的容器&#xff0c;和set容器类似&#xff0c;用于存储一组按照特定顺序排列的元素。与set不同的是&#xff0c;multiset允许重复元素的存在。本文将详细介绍multiset容器的特点、用法以及一些…

基于物联网的实时数据分析(简单介绍)

在当今这个信息化、数字化飞速发展的时代&#xff0c;物联网&#xff08;Internet of Things, IoT&#xff09;和实时数据分析成为了技术革新的两大支柱。对于刚入行的新手来说&#xff0c;理解这两个概念及其相互作用不仅是迈入这一领域的第一步&#xff0c;更是掌握未来技术趋…

Acwing---842.排列数字

排列数字 1.题目2.基本思想3.代码实现 1.题目 给定一个整数 n&#xff0c;将数字 1∼n排成一排&#xff0c;将会有很多种排列方法。 现在&#xff0c;请你按照字典序将所有的排列方法输出。 输入格式 共一行&#xff0c;包含一个整数 n。 输出格式 按字典序输出所有排列方案…

React报错修复:“Uncaught TypeError: destroy is not a function”

报错&#xff1a;Uncaught TypeError: destroy is not a function at commitHookEffectListUnmount 如果你在useEffect函数中使用了async&#xff0c;运行后会出现该报错。 原理解析&#xff1a;     要知道&#xff0c;useEffect 钩子函数的一个特性是清理功能&#xff0c;…

OJ_求最大公约数和最大公倍数

欧几里得算法&#xff08;辗转相除法&#xff09;求最大公约数 这个算法的原理基于以下定理&#xff1a;两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数 #include <stdio.h> // Greatest Common Divisor&#xff0c;简称GCD #define _CRT_SECURE_N…

flask+python儿童福利院管理系统pycharm毕业设计项目

本系统解决了儿童福利院管理事务中的主要问题&#xff0c;包括首页、个人中心、爱心人士管理、员工管理、后勤人员管理、儿童信息管理、院所风采管理、活动管理、食谱管理、领养流程管理、政策法规管理、楼栋管理、宿舍管理、领养申请管理、义工申请管理、捐赠信息管理、宿舍物…

理解SMTP与IMAP协议:Python中的邮件发送与接收

源码分享 ​​https://docs.qq.com/sheet/DUHNQdlRUVUp5Vll2?tabBB08J2​​ 电子邮件是当代通信的一个重要工具。它涉及到多种协议&#xff0c;其中SMTP和IMAP是最关键的。本文将详细介绍这两个协议&#xff0c;并提供Python代码示例&#xff0c;帮助你理解如何在Python中实…

CTFshow web(php命令执行59-67)

web59 <?php /* # -*- coding: utf-8 -*- # Author: Lazzaro # Date: 2020-09-05 20:49:30 # Last Modified by: h1xa # Last Modified time: 2020-09-07 22:02:47 # email: h1xactfer.com # link: https://ctfer.com */ // 你们在炫技吗&#xff1f; if(isset($_POST…

一个 SpringBoot 项目能同时处理多少请求?

目录 1 问题分析 2 Demo 3 答案 4 怎么来的&#xff1f; 5 标准答案及影响参数一Tomcat配置 6 影响参数二 Web容器 7 影响参数三 Async 1 问题分析 一个 SpringBoot 项目能同时处理多少请求&#xff1f; 不知道你听到这个问题之后的第一反应是什么&#xff1f; 我大概…

支付交易——BIN服务

摘要 老王的杂货店里货很多&#xff0c;国产的&#xff0c;进口的&#xff0c;不同种类、不同品牌、不同型号的货&#xff0c;应有尽有。 货多了&#xff0c;老王就弄了个小本本记下店里卖的货有哪些&#xff0c;记得很详细&#xff0c;包括有哪些种类&#xff0c;每个种类里有…

ClickHouse--05--MergeTree 表引擎

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 MergeTree 系列表引擎前言MergeTree 系列表引擎 --功能MergeTree 系列表引擎 --种类 1.MergeTree1.1MergeTree 建表语句&#xff1a;1.2 MergeTree 引擎表目录解析查…

局部特征描述子与关键点

一、局部特征描述子与关键点之间存在密切的关系 关键点&#xff08;Key Points&#xff09;&#xff1a; 关键点是在图像、点云或其他数据中具有显著局部特征的点或区域。这些点通常是在数据中表现出局部结构或特征变化的位置&#xff0c;比如曲率极值点、拐点、纹理变化显著的…

Acwing二分和前缀和(一)

数的范围 原题链接&#xff1a;https://www.acwing.com/problem/content/791/ 整数二分步骤&#xff0c;找一个区间&#xff0c;使得答案一定在区间中。找一个判断条件&#xff0c;使得该判断条件具有二段性&#xff0c;并且答案一定是该二段性的分界点。分析终点在该判断条件下…

【原创】Anaconda安装 Solving Environment错误

conda install XXX 时总是有&#xff1a; Solving environment: failed with initial frozen solve. Retrying with flexible solve. 解决方法&#xff1a; conda config --set channel_priority flexible

速盾cdn:cdn免费注册

速盾CDN是一家专业的内容分发网络&#xff08;CDN&#xff09;服务提供商&#xff0c;为网站提供高速、稳定的访问体验。今天我将为您介绍速盾CDN的注册流程以及其优势。 首先&#xff0c;我们来了解一下什么是CDN。CDN是指内容分发网络&#xff08;Content Delivery Network&…

toString()、equals()、clone()用法

Java中所有类的对象都可以直接使用Object类中提供的一些方法 1. toString()&#xff1a;返回对象的字符串表示形式&#xff0c;通常在类中重写&#xff0c;以便于返回的是对象的内容 2. equals()&#xff1a;判断两个对象的地址是否相等&#xff0c;直接使用也一样&#xff0c;…

社区店选址地理位置评估:大数据分析的力量

大家好&#xff0c;我是一名有着 5 年开店经验的鲜奶吧创业者。在这 5 年的时间里&#xff0c;我深切地体会到了选址对于一家社区鲜奶吧的重要性。一个好的地理位置可以为你的店铺带来源源不断的客流&#xff0c;而一个糟糕的位置则可能让你的创业之路充满坎坷。 在这里&#…

Qt之条件变量QWaitCondition详解

QWaitCondition内部实现结构图&#xff1a; 相关系列文章 C之Pimpl惯用法 目录 1.简介 2.示例 2.1.全局配置 2.2.生产者Producer 2.3.消费者Consumer 2.4.测试例子 3.原理分析 3.1.辅助函数CreateEvent 3.2.辅助函数WaitForSingleObject 3.3.QWaitConditionEvent …