Springboot 使用EasyExcel导出Excel文件

Springboot 使用EasyExcel导出Excel文件

  • Excel导出系列目录:
  • 引入依赖
  • 创建导出模板类
    • 创建图片转化器
  • 逻辑处理
    • controller
    • service
  • 导出效果
  • 遗留问题

Excel导出系列目录:

【Springboot 使用EasyExcel导出Excel文件】
【Springboot 使用POI导出Excel文件】
【Springboot 导出Excel文件方式对比与注意事项】

本文使用EasyExcel导出xlsx后缀的Excel文件。

引入依赖

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version>
</dependency>

创建导出模板类

导出模板类实质就是带有很多EasyExcel注解的实体类,以下类中以属性的形式列出所有excel列且对单元格样式以及字体样式都有设置。

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ContentRowHeight(120)
@AllArgsConstructor
@NoArgsConstructor
public class ExportRecord implements Serializable {@ExcelProperty(value = "序号", order = 1)@ContentFontStyle(fontName = "仿宋", fontHeightInPoints = 12)@ContentStyle(borderTop = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderLeft = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN,horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER, dataFormat = 49)@ColumnWidth(12)private Integer number;@ExcelProperty(value = "时间", order = 2)@ContentFontStyle(fontName = "仿宋", fontHeightInPoints = 12)@ContentStyle(borderTop = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderLeft = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN,horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER, dataFormat = 49)@ColumnWidth(20)private String alarmTime;@ExcelProperty(value = "照片",order = 3,converter = ImageConverter.class)@ContentStyle(borderTop = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderLeft = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN,dataFormat = 49)@ColumnWidth(17)private byte[] faceImageUrl;@ExcelProperty(value = "姓名", order = 4)@ContentFontStyle(fontName = "仿宋", fontHeightInPoints = 12)@ContentStyle(borderTop = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderLeft = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN,verticalAlignment = VerticalAlignmentEnum.CENTER, dataFormat = 49)@ColumnWidth(20)private String staffName;@ExcelProperty(value = "手机号码", order = 5)@ContentFontStyle(fontName = "仿宋", fontHeightInPoints = 12)@ContentStyle(borderTop = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderLeft = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN,horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER, dataFormat = 49)@ColumnWidth(20)private String staffPhone;@ExcelProperty(value = "备注信息", order = 6)@ContentFontStyle(fontName = "仿宋", fontHeightInPoints = 12)@ContentStyle(borderTop = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderLeft = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN,verticalAlignment = VerticalAlignmentEnum.CENTER, dataFormat = 49)@ColumnWidth(20)private String staffRemark;
}

注意:

  1. @ContentStyle注解参数一定要有dataFormat = 49,否则不生效。
  2. @ContentRowHeight指定行高的注解是修饰类的,不是修饰属性字段的。
  3. ImageConverter类是专门用于处理图片的,具体原理我不清楚,也没专门研究,有兴趣的可以自己研究研究。

创建图片转化器

@Slf4j
public class ImageConverter implements Converter<byte[]> {@Overridepublic Class<?> supportJavaTypeKey() {return byte[].class;}@Overridepublic WriteCellData<?> convertToExcelData(byte[] value,ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration)  {if(ObjectUtil.isNotEmpty(value)){try {return new WriteCellData<>(value);}catch (Exception e){log.info("图片获取异常",e);}}return new WriteCellData<>("");}
}

逻辑处理

controller

@RestController
@Slf4j
@RequestMapping({"/v1/test"})
public class TestController {@Resourceprivate TestService testService;@PostMapping("/export_record")public void exportRecord(HttpServletResponse response, @RequestBody GetRecordDto dto) {testService.exportRecord(response, dto);log.info("/export_record 导出记录完毕");}
}

service

@Override
public void exportRecord(HttpServletResponse response, GetRecordDto dto) {try {List<ExportRecord> result = new ArrayList<>();// 查询数据List<GetRecordVo> recordInfoList = ...;int index = 0;for (GetRecordVo item : recordInfoList) {// 将图片转换成byte[]类型数据并为ExportRecord赋值byte[] faceImage = ...;result.add(new ExportRecord().setNumber(++ index).setAlarmTime(item.getAlarmTime()).setFaceImageUrl(faceImage).setStaffName(item.getStaffName()).setStaffPhone(item.getStaffPhone()).setStaffRemark(item.getStaffRemark()));}// 设置文件名以及响应头,导出文件String fileName = UUID.randomUUID().toString().replace("-", "") + "_记录.xlsx" ;response.setContentType("application/OCTET-STREAM;charset=UTF-8");String file = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename=" + file);EasyExcel.write(response.getOutputStream(), ExportRecord.class).sheet("sheet1").doWrite(result);}catch (MixException e){throw e;}catch (Exception e){log.error("导出记录失败:", e);}
}

导出效果

在这里插入图片描述

遗留问题

实现导出之后,发现图片是铺满整个单元格的,每张图片会覆盖住单元格的上边框,所以,我想在放有图片的单元格中加入内边距,但是这个我查了一天始终没有实现,网上的方案有很多但是我用上一直没有生效,最终我放弃了

如果有大佬知道怎么实现,希望能交流一下,谢谢。。。。。。。

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

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

相关文章

如何提高游戏的游戏性

改进游戏玩法是一个动态的过程&#xff0c;需要深入了解是什么让玩家保持参与、挑战和兴奋&#xff0c;以获得更多。优秀游戏的核心是平衡——乐趣和难度的无缝结合&#xff0c;让玩家在不感到沮丧的情况下为自己的技能感到奖励。微调这种平衡通常涉及调整难度曲线&#xff0c;…

HTML+JavaScript案例分享: 打造经典俄罗斯方块,详解实现全过程

在本文中,我们将深入探讨如何使用 JavaScript 实现经典的俄罗斯方块游戏。俄罗斯方块是一款广为人知的益智游戏,通过操纵各种形状的方块,使其在游戏区域内排列整齐,以消除完整的行来获得分数。 效果图如下: 一、游戏界面与布局 我们首先使用 HTML 和 CSS 来创建游戏的界面…

力扣283-- 移动零

开始做梦的地方 力扣283 &#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 何解&#xff1f; 1&#xff0c;暴力枚举&#xff1a…

Vue前端开发2.2 数据绑定

文章目录 一、初识数据绑定&#xff08;一&#xff09;数据绑定概述&#xff08;二&#xff09;数据绑定构成1、定义数据2、输出数据 &#xff08;三&#xff09;数据绑定案例演示1、创建单文件组件2、切换页面显示组件 &#xff08;四&#xff09;将Vue引入HTML页面中1、概述2…

高效文本编辑与导航:Vim中的三种基本模式及粘滞位的深度解析

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

sheng的学习笔记-AI基础-正确率/召回率/F1指标/ROC曲线

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 分类准确度问题 假设有一个癌症预测系统&#xff0c;输入体检信息&#xff0c;可以判断是否有癌症。如果癌症产生的概率只有0.1%&#xff0c;那么系统预测所有人都是健康&#xff0c;即可达到99.9%的准确率。 但显然这样的…

Linux中级(DNS域名解析服务器)

一。产生原因1.IP地址&#xff1a;是互联网上计算机唯一的逻辑地址&#xff0c;通过IP地址实现不同计算机之间的相互通信&#xff0c;每台联网计算机都需要通过IP地址来互相联系和分别&#xff0c;但由于IP地址是由一串容易混淆的数字串构成&#xff0c;人们很难记忆所有计算机…

MySql中的锁的分类

锁的分类 MySQL锁可以按模式分类为&#xff1a;乐观锁与悲观锁。按粒度分可以分为全局锁、表级锁、页级锁、行级锁。按属性可以分为&#xff1a;共享锁、排它锁。按状态分为&#xff1a;意向共享锁、意向排它锁。按算法分为&#xff1a;间隙锁、临键锁、记录锁。 二、全局锁、表…

3-petalinux2018.3 摸索记录 - 命令驱动 _ 交叉编译链

一、命令行控制GPIO 对于ps端设备&#xff0c;在板卡的linux系统中&#xff0c;切换到/sys/class/gpio路径下可以看到目前挂载的gpio设备。 export&#xff1a; 导入用户空间 gpiochip&#xff1a; 系统中gpio寄存器信息 unexport&#xff1a; 移除用户空间 以MIO40和MIO42…

数据结构------手撕链表(一)【不带头单向非循环】

文章目录 链表概念链表的使用LinkedList 的几种遍历方式单链表的模拟实现&#xff08;不带头&#xff09;链表面试题 观察ArrayList 顺序表的源码发现&#xff0c;底层是使用数组实现的。由于其底层是一段连续空间&#xff0c;当在ArrayList任意位置插入或者删除元素时&#xf…

Java基础(7)图书管理系统

目录 1.前言 2.正文 2.1思路 2.2Book包 2.3people包 2.4operation包 2.5主函数 3.小结 1.前言 哈喽大家好吖&#xff0c;今天来给前面Java基础的学习来一个基础的实战&#xff0c;做一个简单的图书管理系统&#xff0c;这里边综合利用了我们之前学习到的类和对象&…

研发运营一体化(DevOps)能力成熟度模型

目录 应用设计 安全风险管理 技术运 持续交付 敏捷开发管理 基于微服务的端到端持续交付流水线案例 应用设计 安全风险管理 技术运 持续交付

Android调用系统相机录像并设置参数

最近要做一个 Android上的录像功能&#xff0c;由于之前做拍照功能完全是用自定义方式&#xff0c;太麻烦。故这次决定直接调用系统相机来录像。 一、添加权限 首先&#xff0c;添加必要的权限 <!-- 授予该程序使用摄像头的权限 --><uses-permission android:name&q…

Could not find artifact cn.hutool:hutool-all:jar:8.1 in central 导入Hutool报错

<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.9</version></dependency> 引入hutool 8.1版本的工具…

攻防世界-流量分析WP

流量分析1来自 <攻防世界> 题目描述:流量分析&#xff0c;你知道这堆流量做了什么事情吗&#xff0c;你能恢复出来flag吗&#xff1f; 1&#xff0c;首先查看IPv4统计信息 如果该流量记录的是黑客的攻击行为产生的流量&#xff0c;那么出现频率最高的流量应该来自攻击者…

2024软考网络工程师笔记 - 第8章.网络安全

文章目录 网络安全基础1️⃣网络安全威胁类型2️⃣网络攻击类型3️⃣安全目标与技术 &#x1f551;现代加密技术1️⃣私钥密码/对称密码体制2️⃣对称加密算法总结3️⃣公钥密码/非对称密码4️⃣混合密码5️⃣国产加密算法 - SM 系列6️⃣认证7️⃣基于公钥的认证 &#x1f552…

论文笔记:LaDe: The First Comprehensive Last-mile Delivery Dataset from Industry

2023 KDD 1 intro 1.1 背景 随着城市化进程的加快和电子商务的发展&#xff0c;最后一公里配送已成为一个关键的研究领域 最后一公里配送&#xff0c;如图1所示&#xff0c;是指连接配送中心和客户的包裹运输过程&#xff0c;包括包裹的取件和配送除了对客户满意度至关重要外…

cpp的vector类

本篇将讲述vector类中的各种重要和常用函数&#xff08;begin&#xff08;&#xff09;、end&#xff08;&#xff09;、rbegin&#xff08;&#xff09;、rend&#xff08;&#xff09;cbegin&#xff08;&#xff09;、cend&#xff08;&#xff09; 、crbegin&#xff08;&a…

Vuejs设计与实现 — 渲染器核心:挂载与更新

前言 挂载 与 更新 是 渲染器 的核心功能&#xff0c;也是渲染器应该要提供的基本功能&#xff0c;而 挂载 和 更新 又是基于 VNode 虚拟节点的&#xff0c;因为 VNode 节点描述了其对应的 真实 DOM 应该是什么样子的。 挂载与卸载 VNode 节点 无论是 vue 还是 react 都引入…

k8s 综合项目笔记

综述 这篇笔记主要是为了记录下自己写 k8s 综合项目的过程。 由于自己之前已经写过简单的开发和运维项目&#xff0c;所以这里就结合一下&#xff0c;在搭建 k8s 集群后安装运维常用服务&#xff0c;比如 ansible 和 prometheus&#xff0c;用 NFS 实现数据存储同步&#xff0c…