【EasyPoi实战系列】Spring Boot使用EasyPoi的注解让表格更漂亮以及图片的导出 - 第468篇

历史文章(文章累计460+)

《国内最全的Spring Boot系列之一》

《国内最全的Spring Boot系列之二》

《国内最全的Spring Boot系列之三》

《国内最全的Spring Boot系列之四》

《国内最全的Spring Boot系列之五》

《国内最全的Spring Boot系列之六》

【EasyPoi实战系列】Spring Boot集成EasyPoi - 第467篇

ChatGPT应用场景实战,拥有ChatGPT等于拥有最强大脑 - 第6篇

文心一言 PK ChatGPT,二者究竟谁更胜一筹 - 第7篇

用Midjourney画个美女,AI绘画也太强大了!!! - 第8篇

悟纤:师傅,你有空吗?

师傅:有事找我?

悟纤:这不上一次留下的问题,还没解决吗。

师傅:瞧最近师傅忙的,都把这个事情忘记了。

悟纤:没事,重要的事情,徒儿都会记得。

师傅:那今天刚好有时间,就和你讲讲。

悟纤:好叻,时刻准备着学习。

导读

Hi,大家好,我是悟纤

我就是我,不一样的烟火。我就是我,与众不同的小苹果。

在前一小节,在Spring Boot中集成了EasyPoi,并且编写了一个导出Excel数据的例子:

数据是正常导出了,但导出的样式还是存在一些问题:

(1)姓名单元格都快把你我挤坏了。

(2)性别怎么能显示数字呢,不得显示对应的男/女吗?

(3)图片显示的地址问题也不大,但是产品还是希望能够显示为图片呢。

(4)出生日期格式也不友好呀。

一、@Excel

@Excel作用到filed上面,是对Excel一列的一个描述

1.1 width设置列宽

上面导出的表格,太挤,就是列宽的问题,设置一下属性width即可:

@Excel(name = "姓名",width = 15)private String realName;

此时导出的效果就会好很多。

对于手机号/邮箱/描述,显示不全,也是相同的问题,设置下width属性,效果如下:

1.2 format日期格式化

对于生成日期,看着这格式也没谁了,这个格式Mon Apr 24 16:36:34 CST 2023,领导看了肯定要挨骂了。对于格式可以通过属性format进行处理:

@Excel(name = "出生日期",format = "yyyy-MM-dd",width = 15)

导出看下效果,真的是beautiful:

现在定义的类型是Date类型,此时如果数据库定义的是一个String类型,而我们导出对象确实Date类型,这个怎么进行格式转换,很简单,只需要执行一个属性:

databaseFormat="yyyyMMddHHmmss";

导出时间设置,如果字段是Date类型则不需要设置 数据库如果是string 类型,这个需要设置这个数据库格式,用以转换时间格式输出。

1.3 replace类型转换

在上面的性别是数字0/1,但希望导出的结果是男/女。这个可以两个属性进行实现:

replace:值的替换 导出是{a_id,b_id} 导入反过来。

suffix:文字后缀,如% 90 变成90%。

@Excel(name = "性别",replace = { "男_1", "女_2" }, suffix = "生")private Integer sex;

到这里效果就几乎接近完美了:

二、图片的导出

图片的导出稍微复杂一丢丢,这里单独来说一下,主要有两种方式的图片的导出。

2.1 从file读取

@Excel(name = "头像地址",type = 2, imageType = 1,width = 40,height = 40)private String avatar;

type =2 该字段类型为图片,imageType=1 (默认可以不填),表示从file读取,字段类型是个字符串类型可以用相对路径也可以用绝对路径,绝对路径优先依次获取。

先使用绝对路径填充下数据:

users.add(new UserExportVO("悟纤",1,new Date(),"18688888888","1688@qq.com","/Users/linxiangxian/Downloads/001.jpg","公众号SpringBoot"));users.add(new UserExportVO("师傅",1,new Date(),"18666666666","1888@qq.com","/Users/linxiangxian/Downloads/001.jpg","公众号SpringBoot"));

导出结果excel表格显示为空白。

芭比Q了,这个真是有毒,后来发现是一个配置问题,找到工具类ExcelUtil,找到如下代码:

public static void exportExcelX(List<?> list, String title, String sheetName, Class<?> pojoClass,String fileName, HttpServletResponse response){    defaultExportX(list, pojoClass, fileName, response, new ExportParams(title, sheetName,ExcelType.XSSF));}

只需要将ExcelType.XSSF修改为ExcelType.HSSF即可。

HSSF:是操作Excel97-2003版本,扩展名为.xls。

XSSF:是操作Excel2007版本开始,扩展名为.xlsx。

SXSSF:是在XSSF基础上,POI3.8版本开始提供的一种支持低内存占用的操作方式,扩展名为.xlsx。

导出效果:

虽然导出正常了,但我就有点困惑了。XSSF是比较新的格式,HSSF是旧的格式,为什么写的这种写法不支持呢?

对于相对路径,有两种情况:

(1)使用了excel的模板文件:图片的相对路径是相对于Excel文件的路径,而不是相对于Spring Boot项目的路径或其他路径。也就是说,如果Excel文件和图片在同一目录下,则只需在Excel中指定图片的文件名即可。如果Excel和图片在不同的目录下,则应使用相对Excel文件路径的子路径指定图片路径。例如,如果Excel文件位于Spring Boot项目的src/main/resources/excel/目录下,图片位于src/main/resources/images/目录下,则应该在Excel文件中指定相对路径为../images/image.png。

(2)代码创建的excel模板文件:如果是在代码中创建Excel,相对路径指的是相对于当前正在执行代码的路径。如果代码中创建Excel文件并在其中插入图片,可以尝试在Java代码中使用相对路径指定图片的路径。

2.1 byte[]的方式

@Excel(name = "公司LOGO", type = 2,imageType = 2 ,width = 40 , height = 40)private byte[] avatar;

需要修改一下导出的逻辑的代码:

File picture = ResourceUtils.getFile("classpath:static/img/001.png");InputStream pictureStream = new FileInputStream(picture);byte[] bytes = IOUtils.toByteArray(pictureStream);users.add(new UserExportVO("悟纤",1,new Date(),"18688888888","1688@qq.com",bytes,"公众号SpringBoot"));users.add(new UserExportVO("师傅",1,new Date(),"18666666666","1888@qq.com",bytes,"公众号SpringBoot"));

通过org.apache.poi.util.IOUtils将InputStream转换为字节数组。

这里的话,读取的是resources/static/img下的图片资源,如果是网络资源的话,只要将网络资源的图片转换为字节数组,依然是可以导出的。

至此整个UserExportVO如下:

package com.example.demo.vo;import cn.afterturn.easypoi.excel.annotation.Excel;import lombok.AllArgsConstructor;import lombok.Data;import java.io.Serializable;import java.util.Date;/** * author:悟纤「公众号SpringBoot」 * date:2023/4/19 */@Data@AllArgsConstructorpublic class UserExportVO implements Serializable {    @Excel(name = "姓名",width = 15)    private String realName;    @Excel(name = "性别",replace = { "男_1", "女_2" }, suffix = "生")    private Integer sex;    @Excel(name = "出生日期",format = "yyyy-MM-dd",width = 15)    private Date birthday;    @Excel(name = "手机号码",width = 20)    private String phone;    @Excel(name = "邮箱",width = 20)    private String email;    //imageType=1:从file读取;imageType=2:从数据库中读取;默认是文件,同样导入也是一样的。//    @Excel(name = "头像地址",type = 2, imageType = 1,width = 40,height = 40)//    private String avatar;    @Excel(name = "公司LOGO", type = 2,imageType = 2 ,width = 40 , height = 40)    private byte[] avatar;    @Excel(name = "描述",width = 20)    private String remark;}

总结

本节和大家一起学习了注解@Excel的基本使用以及如何导出图片的相关操作。

(1)@Excel属性width:设置列宽。

(2)@Excel属性format:设置日期格式。

(3)@Excel属性replace:类型转换。

(4)@Excel属性type和imageType:图片导出的设置。

「关注我不迷路,带你探索新技术」

我是一名热爱技术、分享经验的 IT 从业者。如果您也热爱计算机、喜欢编程、探寻新技术,那么我们一定会成为好朋友!我的微信号是 [wuqian5268],如果你想随时和我交流、讨论技术或者了解我最新的项目和成果,请不要犹豫,立即扫码或者添加我吧!

我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。

à悟纤学院:https://t.cn/Rg3fKJD

学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!

SpringBoot视频:http://t.cn/A6ZagYTi

SpringBoot交流平台:https://t.cn/R3QDhU0

SpringSecurity5.0视频:http://t.cn/A6ZadMBe

ShardingJDBC分库分表:http://t.cn/A6ZarrqS

分布式事务解决方案:http://t.cn/A6ZaBnIr

JVM内存模型调优实战:http://t.cn/A6wWMVqG

Spring入门到精通:https://t.cn/A6bFcDh4

大话设计模式之爱你:https://dwz.cn/wqO0MAy7

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

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

相关文章

拉伯证券|大股东或易主,阿里巴巴换股入局

三大股指齐上扬&#xff0c;早盘主力埋伏这些股。 到午间收盘&#xff0c;“家居零售榜首股”之称的美凯龙一字涨停&#xff0c;港股红星美凯龙涨24%&#xff0c;此前一度涨超30%。 消息面上&#xff0c;1月13日晚间&#xff0c;美凯龙发布公告称&#xff0c;公司控股股东红星…

Day02| 第四期-阿里巴巴股票行情分析(一)

01 前言 2020年高考的第一天到来了&#xff0c;不晓得你的心情如何&#xff0c;我想我们始终忘不了的是对追梦过程中的努力&#xff0c;希望长大以后的我们也不要忘记那种拼搏的精神&#xff0c;今天也会是元气满满的一天&#xff0c;接下来&#xff0c…

2021年PHP会被淘汰吗

首先我可以确定的是&#xff0c;PHP肯定不会被淘汰。 但是市场占有率肯定回不去以前的状态&#xff0c;以前PHP可以做网页的任何事&#xff0c;包括前端和接口。 但是近几年前端的发展非常迅猛&#xff0c;angular、vue和react三大前端框架的相继出现&#xff0c;使得前后端已…

第一个真正实现智能涌现的国产大语言模型,内测即将开启

出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013) 昆仑万维昨日宣布&#xff0c;由昆仑万维和奇点智源合作自研、中国第一个真正实现智能涌现的国产大语言模型 ——「天工」3.5 发布在即&#xff0c;并将于 4 月 17 日启动邀请测试。 公告指出&#xff0c;「天工」大…

Google 工程主管:AIGC 将在三年内终结编程!

大家注意&#xff1a;因为微信最近又改了推送机制&#xff0c;经常有小伙伴说错过了之前被删的文章&#xff0c;比如前阵子冒着风险写的爬虫&#xff0c;再比如一些限时福利&#xff0c;错过了就是错过了。 所以建议大家加个星标&#xff0c;就能第一时间收到推送。&#x1f44…

文献阅读必备常识和工具推荐

本文旨在总结研究生阶段(AI领域)关于论文检索、阅读、期刊会议分区、影响因子等常识问题&#xff0c;也包括一些工具和网站的推荐 1.关于期刊、会议的一些常识 学术论文分为期刊和会议&#xff0c;不同领域期刊和会议的权重不同&#xff0c;计算机领域为例&#xff1a; 计算机…

Qt-》QAudioOutput play 播放wav文件

用Qt写音频比directxShow方便多了&#xff0c;很好用&#xff0c;初级文章&#xff0c;供大家学习路上少分困难&#xff0c;多份轻松。 #include <QFile>#include <QAudioFormat>#include <QAudioOutput>#include <QSound>int main(){QFile inputFile…

将wav音频文件频谱分析后映射到钢琴琴键上(类似audio to midi功能)

import wave import numpy from pyaudio import PyAudio import matplotlib.pyplot as plt from matplotlib.ticker import MultipleLocator, FormatStrFormatter import mathwf wave.open(e:/tests/audio2miditest.wav, rb) # 创建PyAudio对象 p PyAudio() stream p.open(f…

Qt+MPlayer音乐播放器开发笔记(一):ubuntu上编译MPlayer以及Demo演示

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/118713520 长期持续带来更多项目与技术分享&#xff0c;咨询请加QQ:21497936、微信&#xff1a;yangsir198808 红胖子(红模仿)的博文大全&#xff1a;…

android音乐播放器频谱图控件

先上效果图&#xff1a; 先通过测量获取view的宽高&#xff0c;然后将宽分为12份&#xff0c;11份为11个条形柱&#xff0c;剩余一份在分为10份作为条形柱之间的间距 Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMe…

Virtual Piano 自动播放乐谱

钢琴按键分布 钢琴 一共88个键&#xff0c;52个白键&#xff0c;36个黑键。 从左到右按音区分&#xff0c;可分为 低音区&#xff1a;不完整的大二字组、大字一组、大字组&#xff1b; 中音区&#xff1a;小字组、小字一组、小字二组&#xff1b; 高音区&#xff1a;小字三…

Qt开发音乐播放器时,频谱显示控件的详细绘制(好思路)

总第46篇 本文详细梳理了在Qt框架制作音乐播放器的过程中,频谱显示的绘制过程。 在开发音乐播放器的时候,需要将音频数据转换成对应的频谱显示,我们可以采用fmod 第三方库来处理,即通过fomd获取音频数据对应的频谱数据,再在项目中对数据进行绘制即可,这样使工程高度解耦,…

用Qt写一个简单的音乐播放器(一):使用QMediaPlayer播放音乐

一、前言 QMediaplayer可以用于解析音频文件和视频文件&#xff0c;继承自QMediaObject&#xff0c;涉及到的对象为QMediaContent。QMediaObject可以提供关于媒体内容的接入&#xff0c;通过URL进行初始化&#xff0c;同时也可以提供可以播放的媒体文件的列表&#xff0c;与QM…

基于Qt的音乐播放器(一)添加音频文件,播放音乐,更新进度条

2020博客之星年度总评选进行中&#xff1a;请为74号的狗子投上宝贵的一票&#xff01; 我的投票地址&#xff1a;点击为我投票 文章目录 1.实现音频文件对话框(QFileDialog类)2.实现音乐播放&#xff08;QMediaPlayer类/QMediaPlaylist类&#xff09;3.实现进度条更新以及文件…

基于QT的音乐播放器频谱实现

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、官方文档分析二、实现步骤1. 捕获原始音频数字信号2. 读取音频数据3. 计算FFT4. 项目源码目录5. 实际效果 总结 前言 网上的很多音乐播放器频谱实现&#…

A40i使用笔记:使用QT调用aplay播放wav音频/混音

一、前言 在linux当中播放音乐的方式有很多种&#xff0c;我使用的A40i核心板&#xff0c;是 aplay 指令&#xff0c;是 alsa 的一个指令&#xff0c;也就是说需要先安装有 alsa&#xff0c;使用其他arm开发板的小伙伴可以先自行安装alsa之后在进入正文&#xff0c;这里我没实…

音频频谱显示-基于fmod设计音乐播放器并动态显示频谱图(二)

音频频谱显示-显示音频文件静态频谱图(一) https://blog.csdn.net/xiaolong1126626497/article/details/126971535 音频频谱显示-基于fmod设计音乐播放器并动态显示频谱图(二) https://blog.csdn.net/xiaolong1126626497/article/details/126973994 一、前言 在做音乐播…

QT音乐播放器2:切歌,暂停继续合一

1、实现切歌&#xff0c;循环播放 mainwindow.h private slots:void on_nextBt_clicked();void on_frontBt_clicked();在mainwindow.cpp中 MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){//切歌存储歌单列表QFileInfoList infolist …

用Qt写一个简单的音乐播放器(四):歌曲浏览、上一曲、下一曲

一、前言 在用Qt写一个简单的音乐播放器&#xff08;一&#xff09;&#xff1a;使用QMediaPlayer播放音乐中&#xff0c;我们已经知道如何去使用QMediaPlayer播放音乐。 在用Qt写一个简单的音乐播放器&#xff08;二&#xff09;&#xff1a;增加界面&#xff08;开始和暂停音…

如何使用Guitar Pro在乐谱播放时切换效果器音色?

如何使用Guitar Pro在乐谱播放时切换效果器音色&#xff1f; 关键词&#xff1a;吉他谱 Guitar Pro是一款专注于多种乐器谱制作和播放的高效电脑系统软件&#xff0c;我们使用它可以完成非常多的乐谱操作&#xff0c;如乐队排练、和弦学习等适用于高手和新手的功能都不在话下…