esayExcel根据模板导出包含图片

server/2024/11/14 2:25:55/

1、效果

2、模板

3、工具类代码

java">  /*** 根据模板填充* @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、实体类

java">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、接口

java">@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.ppmy.cn/server/141362.html

相关文章

【Docker】自定义网络:实现容器之间通过域名相互通讯

文章目录 一. 默认网络&#xff1a;docker0网络的问题二. 自定义网络三. nginx容器指之间通过主机名进行内部通讯四. redis集群容器&#xff08;跳过宿主机&#xff09;内部网络通讯1. 集群描述2. 基于bitnami镜像的环境变量快速构建redis集群 一. 默认网络&#xff1a;docker0…

【QML 与 C++ 之间的通讯机制】QML 与 Qt 通讯:讲解如何在QML 中使用C++类,以及如何在C++ 中获取QML的内容

> 【QML 与 C 之间的通讯机制】QML 与 Qt 通讯:讲解如何在QML 中使用C类&#xff0c;以及如何在C 中获取QML的内容-阿里云开发者社区 在同一可执行文件中&#xff0c;C和QML共享同一个进程,但是它们运行在不同的线程上。 在Qt中&#xff0c;C和QML都是在同一个进程中运行的&…

MyBatis操作--进阶

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 软件测试专栏:软件测试 关注博主带你了解更多知识 1. 动态SQL 动态SQL是Mybatis的强⼤特性之⼀&#xff0c;能够完成不同条件下不同的sql拼接 1.1 <if>标签 比如说注册…

工位管理现代化:Spring Boot企业级框架

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

爬虫学习5

selenium用法详解【从入门到实战】【Python爬虫】【4万字】_selenium用法详解4万字csdn-CSDN博客 MYSQL数据库 MongoDB数据库 selenium用法详解【从入门到实战】【Python爬虫】【4万字】_selenium用法详解4万字csdn-CSDN博客 redis数据库 黑马程序员Redis入门到实战教程&…

Word2Vec,此向量维度,以及训练数据集单条数据的大小,举例说明;Skip-gram模型实现词嵌入;热编码(One-Hot Encoding)和词向量;

目录 Word2Vec Word2Vec,此向量维度,以及训练数据集单条数据的大小,举例说明 一、Word2Vec的词向量维度 二、训练数据集单条数据的大小 综上所述 热编码(One-Hot Encoding)和词向量 一、表示方式 二、维度与计算效率 三、语义捕捉能力 四、举例说明 Skip-gram模…

使用 HTML、CSS 和 JavaScript 实现动态烟花效果

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 ✨特色专栏&#xff1a…

电脑局域网内让其他电脑通过IP访问配置

依次点击桌面左下角“开始菜单”>“所有应用”>“Windows系统”>“控制面板”&#xff0c;如图所示 在控制面板界面&#xff0c;选择“查看方式”为“大图标”&#xff0c;然后点击打开window防火墙&#xff0c;如图所示 然后点击“高级设置”&#xff0c;如图所示 在…