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.hqwc.cn/news/469729.html

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

相关文章

Unicode编码的魅力:跨语言交流的桥梁

title: Unicode编码的魅力&#xff1a;跨语言交流的桥梁 date: 2024/2/15 14:04:00 updated: 2024/2/15 14:04:00 tags: Unicode编码跨语言多语言支持存储开销兼容性文本处理全球化软件 引言&#xff1a; Unicode编码是一种用于表示世界上所有字符的标准编码方式。它解决了字…

探索IDE的世界:什么是IDE?以及适合新手的IDE推荐

引言 在编程的世界里&#xff0c;集成开发环境&#xff08;IDE&#xff09;是我们日常工作的重要工具。无论是初学者还是经验丰富的开发者&#xff0c;一个好的IDE都能极大地提高我们的编程效率。那么&#xff0c;什么是IDE呢&#xff1f;对于新手来说&#xff0c;又应该选择哪…

常见单例模式详解

单例模式是23种设计模式中应用最广的模式之一&#xff0c;其定义&#xff1a;确保某一个类只有一个实例&#xff0c;而且自行实实例化并向整个系统通过这个实例。其类图如下&#xff1a; 通俗来说&#xff0c;单例模式就是用于创建那些在软件系统中独一无二的对象。在一个软件系…

Java 基于 SpringBoot+Vue 的智慧外贸平台的研究与实现,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

基于Transformer的机器学习模型的主动学习

主动学习和基于Transformer的机器学习模型的结合为有效地训练深度学习模型提供了强有力的工具。通过利用主动学习&#xff0c;数据科学家能够减少训练模型所需的标记数据的数量&#xff0c;同时仍然达到高精度。本文将探讨基于Transformer的机器学习模型如何在主动学习环境中使…

嵌入式Linux中系统调试常用命令

在 Linux 中&#xff0c;获取系统信息和监控系统资源的操作是非常常见的任务。以下是一些常用的命令和工具&#xff0c;以及一些相关的系统文件&#xff0c;用于获取 Linux 系统信息和监控系统资源。 1. 基本系统信息 uname 命令 uname 命令用于显示系统信息。 查看内核版本&…

【Python】高级数据类型

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…

洛谷C++简单题小练习day11—字母转换,分可乐两个小程序

day11--字母转换--2.14 习题概述 题目描述 输入一个小写字母&#xff0c;输出其对应的大写字母。例如输入 q[回车] 时&#xff0c;会输出 Q。 代码部分 #include<bits/stdc.h> using namespace std; int main() { char n;cin>>n;cout<<char(n-32)<…

C++:Level1阶段测试

总结。 只要你看过我的文章&#xff0c;哪怕只是一半&#xff0c;一定能够过关&#xff01; 准备好开始测试氻吗&#xff1f; 选择题&#xff0c;每题4分&#xff0c;共40分 1、 DevC的项目创建按钮是_____ A、文件[F]” → “新建[N]” → “项目[P]... B、工具[T]” → …

TMGM外汇平台,澳网的官方赞助商

TMGM澳洲总部公司很高兴地通知大家&#xff0c;为了带给客户们更优质的交易环境体验&#xff0c;我们预计将于2024年2月上线MT5交易平台TMGM作为2021-2023 澳网的官方赞助商&#xff0c;能见证郑钦文取得如此的成就由衷的为她感到骄傲&#xff01;本届澳网&#xff0c;TMGM邀请…

操作系统(14)----文件系统的结构

目录 一.文件系统的层次结构 1.用户接口&#xff1a; 2.文件目录系统&#xff1a; 3.存取控制模块&#xff1a; 4.逻辑文件系统与文件信息缓冲区&#xff1a; 5.物理文件系统&#xff1a; 二.文件系统的全局结构 1.文件系统在外存中的结构 &#xff08;1&#xff09;物…

算法学习——LeetCode力扣贪心篇2

算法学习——LeetCode力扣贪心篇2 45. 跳跃游戏 II 45. 跳跃游戏 II - 力扣&#xff08;LeetCode&#xff09; 描述 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 num…