当前位置: 首页 > news >正文

Springboot 使用EasyExcel导出含图片并设置样式的Excel文件

Springboot 使用EasyExcel导出含图片并设置样式的Excel文件

  • Excel导出系列目录:
  • ★★★★尤其注意:
  • 引入依赖
  • 创建导出模板类
  • 逻辑处理
    • controller
    • service
  • 导出效果
  • 总结

Excel导出系列目录:

【Springboot 使用EasyExcel导出Excel文件】
【Springboot 使用EasyExcel导出含图片并设置样式的Excel文件】
【Springboot 使用POI导出Excel文件】
【Springboot 导出Excel文件方式对比与注意事项】

★★★★尤其注意:

WPS对xlsx后缀文件兼容性不好,如果样式要求高,需要兼容各种excel软件,那就导出xls后缀的文件。具体见【Springboot 导出Excel文件方式对比与注意事项】

本文使用EasyExcel导出xlsx后缀的含指定样式图片的Excel文件,用于解决上一篇文章:【Springboot 使用EasyExcel导出Excel文件】的遗留问题

引入依赖

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

创建导出模板类

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.converters.string.StringImageConverter;
import com.alibaba.excel.metadata.data.WriteCellData;
import lombok.Data;
import lombok.EqualsAndHashCode;import java.io.File;
import java.io.InputStream;
import java.net.URL;@Data
@EqualsAndHashCode
@ContentRowHeight(100)
@ColumnWidth(100 / 8)
public class ImageDemoData {private File file;private InputStream inputStream;/*** 如果string类型 必须指定转换器,string默认转换成string*/@ExcelProperty(converter = StringImageConverter.class)private String string;private byte[] byteArray;/*** 根据url导出** @since 2.1.1*/private URL url;/*** 根据文件导出 并设置导出的位置。** @since 3.0.0-beta1*/private WriteCellData<Void> writeCellDataFile;
}

逻辑处理

controller

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

service

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.data.ImageData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.util.FileUtils;
import com.alibaba.excel.util.ListUtils;
import java.io.File;
import java.io.InputStream;
import java.net.URL;@Override
public void exportRecord(GetRecordDto dto) {String fileName = "导出文件下载地址,后缀为xlsx";String imagePath = "图片地址";try (InputStream inputStream = FileUtils.openInputStream(new File(imagePath))) {List<ImageDemoData> list =  ListUtils.newArrayList();ImageDemoData imageDemoData = new ImageDemoData();list.add(imageDemoData);// 放入五种类型的图片 实际使用只要选一种即可imageDemoData.setByteArray(FileUtils.readFileToByteArray(new File(imagePath)));imageDemoData.setFile(new File(imagePath));imageDemoData.setString(imagePath);imageDemoData.setInputStream(inputStream);imageDemoData.setUrl(new URL("图片url"));// 这里演示// 需要额外放入文字// 而且需要放入2个图片// 第一个图片靠左// 第二个靠右 而且要额外的占用他后面的单元格WriteCellData<Void> writeCellData = new WriteCellData<>();imageDemoData.setWriteCellDataFile(writeCellData);// 这里可以设置为 EMPTY 则代表不需要其他数据了writeCellData.setType(CellDataTypeEnum.STRING);writeCellData.setStringValue("额外的放一些文字");// 可以放入多个图片List<ImageData> imageDataList = new ArrayList<>();ImageData imageData = new ImageData();imageDataList.add(imageData);writeCellData.setImageDataList(imageDataList);// 放入2进制图片imageData.setImage(FileUtils.readFileToByteArray(new File(imagePath)));// 图片类型imageData.setImageType(ImageData.ImageType.PICTURE_TYPE_PNG);// 上 右 下 左 需要留空// 这个类似于 css 的 margin// 这里实测 不能设置太大 超过单元格原始大小后 打开会提示修复。暂时未找到很好的解法。imageData.setTop(5);imageData.setRight(5);imageData.setBottom(5);imageData.setLeft(5);// 放入第二个图片imageData = new ImageData();imageDataList.add(imageData);writeCellData.setImageDataList(imageDataList);imageData.setImage(FileUtils.readFileToByteArray(new File(imagePath)));imageData.setImageType(ImageData.ImageType.PICTURE_TYPE_PNG);imageData.setTop(5);imageData.setRight(5);imageData.setBottom(5);imageData.setLeft(50);// 设置图片的位置 假设 现在目标 是 覆盖 当前单元格 和当前单元格右边的单元格// 起点相对于当前单元格为0 当然可以不写imageData.setRelativeFirstRowIndex(0);imageData.setRelativeFirstColumnIndex(0);imageData.setRelativeLastRowIndex(0);// 前面3个可以不写  下面这个需要写 也就是 结尾 需要相对当前单元格 往右移动一格// 也就是说 这个图片会覆盖当前单元格和 后面的那一格imageData.setRelativeLastColumnIndex(1);// 写入数据EasyExcel.write(fileName, ImageDemoData.class).sheet().doWrite(list);}catch (Exception e){log.error("export error: ",e);}
}

导出效果

在这里插入图片描述

总结

这个我是在网上找的,我也拿到代码在本地环境实操了,确认没有问题可以实现,我这边简单的实现直接生成文件到本地了,具体返回response流的方式大家可以借鉴我的上一篇文章:【Springboot 使用EasyExcel导出Excel文件】

借鉴来源:easyExcel帮助文档
这个文档已经迁移到该地址:easyExcel帮助文档-新地址

但是目前两个地址都是可以用的,我还是推荐用旧地址,新地址的该实例描述的截图不正确,容易错过,大家要注意。

http://www.lryc.cn/news/483119.html

相关文章:

  • 技术分享:《越南语翻译通》App高效学习越南语的智能助手,是怎么实现高精度语音识别翻译功能的呢?
  • 工业互联网实验实训解决方案核心优势
  • Ceph client 写入osd 数据的两种方式librbd 和kernel rbd
  • 相机光学(四十二)——sony的HDR技术
  • 文件上传漏洞--理论
  • 快速入门Selenium自动化测试
  • C++指针使用指南
  • 一文学会,利用LLaMA 3.2打造能“识图断字”的个人AI助理
  • idea的mapper.xml文件里写sql语句出现Tag name expected错误提示
  • EasyExcel 使用多线程按顺序导出数据
  • 数据驱动的投资分析:民锋科技的量化模型探索
  • cesium 设置相机视角 flyTo 参数destination,orientation
  • vue+Leaflet.PM插件实现创建和编辑几何图形(点、线、面、圆等)
  • Rust语言在系统编程中的应用
  • test 是 JavaScript 中正则表达式对象 (RegExp) 的一种方法,用于测试一个字符串是否匹配某个正则表达式
  • 大厂社招3年-力扣热点高频刷题记录(已更新100+道热点题)
  • 6.2 对角化矩阵(2)
  • ubuntu24.04播放语音视频
  • GPT4的下一代Orion已经降速了?
  • SpringCloud框架学习(第二部分:Consul、LoadBalancer和openFeign)
  • Linux 批量配置互信
  • 设计定长的内存池
  • 【动手学电机驱动】 STM32-FOC(7)基于 MCSDK6.0 控制与调试速度环
  • 无人机飞手考证,地面站培训技术详解
  • 音视频入门基础:MPEG2-TS专题(3)——TS Header简介
  • Sam Altman:年底将有重磅更新,但不是GPT-5!
  • 基于物联网的智能超市快速结算系统
  • 241111.学习日志——[CSDIY] Cpp零基础速成 [00]
  • 湘潭大学软件工程算法设计与分析实验-模拟退火算法
  • Three.js 零基础+概念理解