esayExcel根据模板导出包含图片

1、效果

2、模板

3、工具类代码

  /*** 根据模板填充* @param response* @param templateStream 模板文件流* @param map 模板文件所需要的参数* @param list list循环模板参数* @throws IOException*/public static void templateFilling(HttpServletRequest servletRequest,HttpServletResponse response, InputStream templateStream, Map<String, Object> map, List<FillWrapper> list,String name) throws IOException {try {if (templateStream == null) {throw new FileNotFoundException("未找到模板文件");}// 生成目标文件ExcelWriter excelWriter =EasyExcel.write(response.getOutputStream()).withTemplate(templateStream).build();WriteSheet writeSheet = EasyExcel.writerSheet().build();// 每次都会重新生成新的一行,而不是使用下面的空行FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();excelWriter.fill(map, writeSheet);// 第二种占位符替换for (FillWrapper fillWrapper : list) {excelWriter.fill(fillWrapper, fillConfig, writeSheet);}excelWriter.finish();/*兼容IE和其他浏览器导出文件名乱码的问题*/name = downloadCommFileName(name, servletRequest);// 设置响应头response.setContentType("application/vnd.ms-excel"); // 设置文本内省response.setCharacterEncoding("utf-8"); // 设置字符编码response.setHeader("Content-disposition", "attachment;fileName="+name+".xlsx");// 关闭模板流templateStream.close();} catch (FileNotFoundException e) {// 处理文件未找到异常response.setStatus(HttpServletResponse.SC_NOT_FOUND);// 返回适当的错误消息response.getWriter().write("未找到模板文件");} catch (Exception e) {// 处理其他异常response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);// 返回适当的错误消息response.getWriter().write("内部服务器错误");}}

4、实体类

package com.skybird.iot.addons.tpm.care.backend.jdo;import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import lombok.EqualsAndHashCode;import java.net.URL;@EqualsAndHashCode
@ContentRowHeight(15)
@ColumnWidth(15)
public class DeviceCareOrderTemplateExcelDao {@ExcelProperty("保养部位")private String part;@ExcelProperty("保养项目")private String project;@ExcelProperty("作业方法")private String method;@ExcelProperty("保养标准")private String standard;@ExcelProperty("图片说明")private URL viewImage;@ExcelProperty("保养结果")private String result;@ExcelProperty("备注")private String remark;public String getPart() {return part;}public void setPart(String part) {this.part = part;}public String getProject() {return project;}public void setProject(String project) {this.project = project;}public String getMethod() {return method;}public void setMethod(String method) {this.method = method;}public String getStandard() {return standard;}public void setStandard(String standard) {this.standard = standard;}public URL getViewImage() {return viewImage;}public void setViewImage(URL viewImage) {this.viewImage = viewImage;}public String getResult() {return result;}public void setResult(String result) {this.result = result;}public String getRemark() {return remark;}public void setRemark(String remark) {this.remark = remark;}
}

5、URL数据说明

viewImage字段数据需要组装成图片地址

6、接口

@RequestMapping("/exportTemplate")public void exportTemplate(HttpServletRequest request, HttpServletResponse response) throws IOException {String data = request.getParameter("data");Document filter = DocuLib.parseDecode(data);String id = DocuLib.getID(filter);Document entity = DBUtils.findByID(QDeviceCareOrder.collectionName, id);// 获取协议(例如 http: 或 https:)String protocol = request.getScheme();// 获取主机名(例如 localhost)String hostname = request.getServerName();// 获取端口号(如果有)int port = request.getServerPort();// 构建前缀部分StringBuilder baseUrl = new StringBuilder();baseUrl.append(protocol).append("://").append(hostname);// 如果有端口号,添加端口号if ((protocol.equals("http") && port != 80) || (protocol.equals("https") && port != 443)) {baseUrl.append(":").append(port);}// 获取上下文路径(例如 /yoren)String contextPath = request.getContextPath();if (contextPath != null && !contextPath.isEmpty()) {baseUrl.append(contextPath);}String head = baseUrl+"/";InputStream templateStream =DeviceCareOrderWeb.class.getResourceAsStream("/templates/deviceCare.xlsx");List<Document> itemList = DocuLib.getList(entity, "itemList");List<DeviceCareOrderTemplateExcelDao> excelList = new ArrayList<>();for (Document item : itemList) {DeviceCareOrderTemplateExcelDao dao = new DeviceCareOrderTemplateExcelDao();dao.setPart(DocuLib.getStr(item, "part"));dao.setProject(DocuLib.getStr(item, "project"));dao.setMethod(DocuLib.getStr(item, "method"));dao.setStandard(DocuLib.getStr(item, "standard"));String viewImage = DocuLib.getStr(item, "view_image");dao.setViewImage(StrUtil.isNotEmpty(viewImage)?new URL(head + "gridfs/" + viewImage):null);dao.setResult(StrUtil.isNotEmpty(DocuLib.getStr(item, "result")) ? DocuLib.getStr(item, "result").equals("finish") ? "完成" : "异常" : "");dao.setRemark(DocuLib.getStr(item, "remark"));excelList.add(dao);}List<Document> fileImageList = DocuLib.getList(entity, "fileImageList");List<DeviceCareOrderTemplateExcelDao> ImageList = new ArrayList<>();for (Document item : fileImageList) {DeviceCareOrderTemplateExcelDao dao = new DeviceCareOrderTemplateExcelDao();dao.setViewImage(new URL(head + DocuLib.getStr(item, "url")));ImageList.add(dao);}Map<String, Object> map = new HashMap<>();map.put("code", DocuLib.getStr(entity,"code"));map.put("name", DocuLib.getStr(entity,"name"));map.put("deviceName", DocuLib.getStr(entity,"device.name"));String start = StrUtil.isNotEmpty(DocuLib.getStr(entity,"planDateBetween.start"))? DocuLib.getStr(entity,"planDateBetween.start"): "";String end = StrUtil.isNotEmpty(DocuLib.getStr(entity,"planDateBetween.end"))? DocuLib.getStr(entity,"planDateBetween.end"): "";map.put("time", start + "~" + end);map.put("workTimeBegin", DocuLib.getStr(entity,"workTimeBegin"));map.put("workTimeEnd", DocuLib.getStr(entity,"workTimeEnd"));map.put("workTimeHour", DocuLib.getStr(entity,"workTimeHour")+" 小时");map.put("remark", DocuLib.getStr(entity,"remark"));map.put("createUserName", DocuLib.isNotEmpty(DocuLib.getDocu(entity,"createUser"))?DocuLib.getStr(entity,"createUser.userName")+"-"+DocuLib.getStr(entity,"createUser.name"):"");map.put("createDate", DateUtil.format(DocuLib.getDate(entity, "create_date"), "yyyy-MM-dd HH:mm:ss.SSS"));map.put("careUserName", DocuLib.isNotEmpty(DocuLib.getDocu(entity,"careUser"))?DocuLib.getStr(entity,"careUser.userName")+"-"+DocuLib.getStr(entity,"careUser.name"):"");map.put("startTime", DateUtil.format(DocuLib.getDate(entity, "start_time"), "yyyy-MM-dd HH:mm:ss.SSS"));map.put("auditUserName", DocuLib.isNotEmpty(DocuLib.getDocu(entity,"auditUser"))?DocuLib.getStr(entity,"auditUser.userName")+"-"+DocuLib.getStr(entity,"auditUser.name"):"");map.put("auditTime", DateUtil.format(DocuLib.getDate(entity, "audit_time"), "yyyy-MM-dd HH:mm:ss.SSS"));List<FillWrapper> list = new ArrayList<>();if (CollUtil.isNotEmpty(excelList)) {list.add(new FillWrapper("dto", excelList));}if (CollUtil.isNotEmpty(ImageList)) {list.add(new FillWrapper("row", ImageList));}templateFilling(request,response,templateStream,map,list,StrUtil.join("-", "设备保养详情", System.currentTimeMillis()));}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux系统编程】第四十五弹---线程互斥:从问题到解决,深入探索互斥量的原理与实现

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、线程互斥 1.1、见一见多线程访问问题 1.2、解决多线程访问问题 1.2.1、互斥量的接口 1.2.2、互斥量接口的使用 1.2.3、…

【贪心算法】贪心算法三

贪心算法三 1.买卖股票的最佳时机2.买卖股票的最佳时机 II3.K 次取反后最大化的数组和4.按身高排序5.优势洗牌&#xff08;田忌赛马&#xff09; 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#…

认知战认知作战:雍正设立军机处的认知战策略分析

认知战认知作战&#xff1a;雍正设立军机处的认知战策略分析 认知战认知作战&#xff1a;雍正设立军机处的认知战策略分析 认知战认知作战&#xff1a;雍正设立军机处的认知战策略分析 关键词&#xff1a;认知作战,新质生产力,人类命运共同体,认知战,认知域,认知战研究中心,认…

AI - 人工智能;Open WebUI;Lobe Chat;Ollama

AI - 人工智能&#xff1b;Ollama大模型工具&#xff1b;Java之SpringAI&#xff08;三&#xff09; 鉴于使用Ollama的命令行交互不是很方便&#xff0c;所以我们需要另一个开源的WebUI&#xff0c;搭建一个能通过浏览器访问的界面&#xff1b;Ollama的Web & Desktop非常多…

特斯拉车速转向电量充电油门刹车档位车门座椅调节灯光信号采集

特斯拉CAN信号采集方案主要包括硬件连接、数据采集与配置、数据解析与可视化等步骤。速锐得主要采集和测试关于特斯拉车速转向电量充电油门刹车档位车门座椅调节灯光信号。 我们拆开特斯拉网关部分用于CAN总线的连接&#xff0c;将CANH和CANL接入到网关对应的CAN针脚&#xff0…

【LLM Agents体验 3】利用Open-WebUI+Ollama本地部署Qwen2.5:7B大模型的安装指南

Open WebUI是一种基于 Web 的用户界面&#xff0c;用于管理和操作各种本地和云端的人工智能模型。它提供了一个直观的图形化界面&#xff0c;使用户可以方便地加载、配置、运行和监控各种 AI 模型&#xff0c;而无需编写代码或使用命令行界面。 Open-WebUI 是一款功能强大且易于…

3.2 Fiddler基础测试

1 请求响应报文 1.1 请求部分 Headers&#xff1a;显示请求的头信息&#xff0c;重点关注请求类型。textView & SyntaxView&#xff1a;分别以纯文本和语法高亮的方式显示请求参数。WebForms&#xff1a;显示请求的 GET 参数和 POST body 内容。HexView&#xff1a;以十六…

《TCP/IP网络编程》学习笔记 | Chapter 9:套接字的多种可选项

《TCP/IP网络编程》学习笔记 | Chapter 9&#xff1a;套接字的多种可选项 《TCP/IP网络编程》学习笔记 | Chapter 9&#xff1a;套接字的多种可选项套接字可选项和 I/O 缓冲大小套接字多种可选项getsockopt & setsockoptSO_SNDBUF & SO_RCVBUF SO_REUSEADDR发生地址绑定…

ISAAC SIM踩坑记录--ROS2相机影像发布

其实这个例子官方和大佬NVIDIA Omniverse和Isaac Sim笔记5&#xff1a;Isaac Sim的ROS接口与相机影像、位姿真值发布/保存都已经有详细介绍了&#xff0c;但是都是基于ROS的&#xff0c;现在最新的已经是ROS2&#xff0c;这里把不同的地方简单记录一下。 搭建一个简单的场景&a…

【C++】模板(一):函数模板

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解C的函数模板&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 1&#xff0e;模板2. 函数模板1 概念2 函数模板的实例化(A) 隐式实例化&#xff1a;让编译…

通俗易懂的介绍期权如何开户以及条件与规则!

一文带你了解通俗易懂的介绍期权如何开户以及条件与规则&#xff0c;一般在证券和期货开通期权账户是需要满足基本的验资门槛&#xff0c;而期权平台是可以在线上开通的。具体的期权开户过程可以参考以下几个步骤。 一、期权开户的条件和流程 1. 年龄要求&#xff1a;投资者必…

【go从零单排】Text Templates

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 Go 中的文本模板&#xff08;Text Templates&#xff09;是通过 text/template 包…

mysql 常用命令(二)

1、创建空表 mysql> CREATE TABLE test ( id int(4) NOT NULL AUTO_INCREMENT, name char(20) NOT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETlatin1;AUTO_INCREMENT&#xff1a;自增&#xff0c;下次插入数据&#xff0c;会自动增加ID的值&#xff0c;…

麦肯锡数字化转型方法论:系统性四步法

在全球范围内&#xff0c;众多企业纷纷投身于数字化转型&#xff0c;对价值链各环节产生深远影响。 数字化转型不仅能够创造价值&#xff0c;提高生产力&#xff0c;还能帮助企业保持竞争优势。 然而&#xff0c;大多数转型都因准备不充分而遭遇失败。 麦肯锡通过对全球上千个…

政企学习考试系统(源码+文档+部署+讲解)

本文将深入解析“政企学习考试系统”的项目&#xff0c;探究其架构、功能以及技术栈&#xff0c;并分享获取完整源码的途径。 系统概述 本项目名称为政企学习考试系统&#xff0c;是一款面向政企用户的在线学习与考试平台。该系统旨在为用户提供便捷、高效的学习和考核服务&a…

Jmeter基础篇(22)服务器性能监测工具Nmon的使用

一、前言 我们在日常做压测的过程中&#xff0c;不仅仅需要监控TPS&#xff0c;响应时间&#xff0c;报错率等这些系统基础性能数据&#xff0c;还需要对服务器的性能&#xff08;如CPU、磁盘、内存、网络IO等&#xff09;做监控&#xff0c;以求对系统运行过程中的硬件性能有…

三级等保安全解决方案,实施方案,整改方案(Word,PPT等相关资料学习)

信息系统进行三级等保的主要原因在于保障信息安全&#xff0c;维护国家安全和公共利益。三级等保是我国根据相关法律法规制定的信息安全等级保护制度中的一部分&#xff0c;旨在确保信息系统的完整性、可用性和保密性。通过三级等保&#xff0c;信息系统可以得到一系列的安全保…

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

Springboot 使用EasyExcel导出含图片并设置样式的Excel文件 Excel导出系列目录&#xff1a;★★★★尤其注意&#xff1a;引入依赖创建导出模板类逻辑处理controllerservice 导出效果总结 Excel导出系列目录&#xff1a; 【Springboot 使用EasyExcel导出Excel文件】 【Springb…

老破机器硬盘要坏,转移虚拟机里的打字平台过程全记录

我有一台老破机器&#xff0c;说破其实没多破&#xff0c;但是老应该是有几年了&#xff0c;这机器一开始一直放在领导办公室不让人用&#xff0c;后来因为单位整体搬迁&#xff0c;我跟领导讨了来&#xff0c;win10的系统&#xff0c;我装了个虚拟机好像是15的版本&#xff0c…

光流法与直接法在SLAM中的应用

本文总结视觉SLAM中常用的光流法与直接法 1、Lucas-Kanade光流法 相机所拍摄到的图像随相机视角的变化而变化&#xff0c;这种变化也可以理解为图像中像素的反向移动。“光流”&#xff08;Optical Flow&#xff09;是指通过分析连续图像帧来估计场景中像素或特征点的运动的技…