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{}定…

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

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

Acwing---842.排列数字

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

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

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

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 引擎表目录解析查…

Acwing二分和前缀和(一)

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

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 …

一个小例子,告诉你什么是衍生式设计

之前好多小伙伴想让我介绍介绍Dynamo与衍生式设计&#xff0c;奈何最近太忙了&#xff0c;实在没时间弄这些~趁着端午节&#xff0c;今天用一个小案例&#xff0c;先简单让大家对衍生式设计有个初步认识&#xff0c;之后有时间&#xff0c;我再多写几篇关于这方面的文章&#x…

Java使用opencsv完成对csv批量操作

文章目录 前言一、maven二、造数三、代码部分1.OpenCsvController2.OpenCsvUtil3.StudentInfo4.CodeToValue 三、效果展示1.download2.upload 总结 前言 csv文件是不同于excel文件的另一种文件&#xff0c;常常以,作为分隔符&#xff0c;本篇将通过JavaBean的形式完成对csv文件…

Linux_进程地址空间

我们用c语言写的程序&#xff0c;经过编译后形成可执行程序存放在硬盘。当运行该程序时&#xff0c;操作系统将该程序加载到内存中&#xff0c;创建进程控制块&#xff0c;变为进程&#xff0c;然后开始执行该程序。大家是否想过&#xff0c;操作系统是如何加载的呢&#xff1b…

25天物理探索旅程 - 第三天:相对论时空观的构建

第三天的课堂&#xff0c;我们将踏上一段穿越时空的奇幻旅程&#xff0c;探索那个由爱因斯坦用天才智慧构建起来的相对论世界。想象一下&#xff0c;你手握一把名为“狭义相对论”的神奇钥匙&#xff0c;准备开启一扇通往全新宇宙观的大门。 首先&#xff0c;我们来聊聊同时性…

【c语言】字符串常见函数 下

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;c语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&a…

幻兽帕鲁Palworld服务器设置参数(汉化)

创建幻兽帕鲁服务器配置参数说明&#xff0c;Palworld服务器配置参数与解释&#xff0c;阿腾云atengyun.com分享&#xff1a; 自建幻兽帕鲁服务器教程&#xff1a; 阿里云教程 https://t.aliyun.com/U/bLynLC腾讯云教程 https://curl.qcloud.com/oRMoSucP 幻兽帕鲁服务器 幻…

如何使用idea连通服务器上的Redis(详细版本)

这里我使用的是阿里云的服务器 打开阿里云的安全组&#xff0c;设置端口为6379 在redis.conf文件中&#xff0c;注释bind 127.0.0.1 将protected-mode设置为no&#xff0c;即关闭保护模式 更改服务器中的防火墙&#xff0c;放行6379端口 # 放行端口 firewall-cmd --zo…

Nacos 的配置管理和配置热更新

一、配置管理的必要性 1. 存在问题 微服务重复配置过多维护成本高&#xff1a;将各个微服务的配置都写到配置管理服务中&#xff0c;单个微服务不去编写配置&#xff0c;而是到配置管理服务中读取配置&#xff0c;实现配置共享&#xff0c;便于修改和维护 业务配置经常变动&a…