From 3eaaa50be4f86151e1ea9380664c0e391c2a88d3 Mon Sep 17 00:00:00 2001 From: gjh <1421wake> Date: Mon, 8 Sep 2025 14:00:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=BA=E4=B8=BA=E5=B9=B2=E6=89=B0=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SiteEvaluationInfoController.java | 5 + .../service/ISiteEvaluationInfoService.java | 3 + .../impl/SiteEvaluationInfoServiceImpl.java | 98 +++++++++++++++++- .../src/main/resources/human_template.docx | Bin 0 -> 20044 bytes 4 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 ruoyi-modules/ruoyi-demo/src/main/resources/human_template.docx diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/SiteEvaluationInfoController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/SiteEvaluationInfoController.java index 444b93b..c303688 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/SiteEvaluationInfoController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/SiteEvaluationInfoController.java @@ -109,4 +109,9 @@ public class SiteEvaluationInfoController extends BaseController { public void download( HttpServletResponse response) throws Exception { siteEvaluationInfoService.download(response); } + + @GetMapping("/download/world2") + public void download2( HttpServletResponse response) throws Exception { + siteEvaluationInfoService.download2(response); + } } diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/ISiteEvaluationInfoService.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/ISiteEvaluationInfoService.java index b1c6b1e..ac23387 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/ISiteEvaluationInfoService.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/ISiteEvaluationInfoService.java @@ -7,6 +7,7 @@ import org.dromara.demo.domain.bo.SiteEvaluationInfoBo; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; +import java.io.FileNotFoundException; import java.io.IOException; import java.util.Collection; import java.util.List; @@ -70,4 +71,6 @@ public interface ISiteEvaluationInfoService { Boolean deleteWithValidByIds(Collection ids, Boolean isValid); void download(HttpServletResponse response) throws Exception; + + void download2(HttpServletResponse response) throws Exception; } diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/SiteEvaluationInfoServiceImpl.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/SiteEvaluationInfoServiceImpl.java index bf65661..996868d 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/SiteEvaluationInfoServiceImpl.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/SiteEvaluationInfoServiceImpl.java @@ -237,6 +237,67 @@ public class SiteEvaluationInfoServiceImpl implements ISiteEvaluationInfoService try (templateIs) { // 3. 创建临时文件 → 填充模板 File tempFile = File.createTempFile("temp", ".docx"); + // 告诉 JVM:当程序正常退出时(JVM 关闭),自动删除这个临时文件。 + tempFile.deleteOnExit(); + Files.copy(templateIs, tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING); + + XWPFDocument document = WordExportUtil.exportWord07(tempFile.getAbsolutePath(), data); + AttachmentVo attachmentVo = new AttachmentVo(); + List attachmentList = new ArrayList<>(); + + Attachment attachment1 = new Attachment(); + attachment1.setDescription("描述1"); + attachment1.setOssId("1964745602352324609"); + attachment1.setName("故障图片.png"); + attachmentList.add(attachment1); + + Attachment attachment2 = new Attachment(); + attachment2.setDescription("描述2"); + attachment2.setOssId("1964745602352324609"); + attachment2.setName("故障图片.png"); + attachmentList.add(attachment2); + attachmentVo.setAttachmentList(attachmentList); + + appendImages(document,attachmentVo ,ossService); + + // ✅ 4. 设置响应头 + String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20"); + + response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); + response.setHeader("Content-Disposition", + "attachment1; filename=\"" + encodedFileName + "\"; filename*=UTF-8''" + encodedFileName); + response.setCharacterEncoding("UTF-8"); + + // ✅ 5. 写入输出流 + document.write(response.getOutputStream()); + + // ✅ 6. 关闭 document + document.close(); + + // ✅ 7. 强制刷新输出缓冲区(关键!) + response.flushBuffer(); + } + // ✅ try 结束前,数据已发出 + } + + @Override + public void download2(HttpServletResponse response) throws Exception { + // 1. 准备数据 + Map data = getHumanData(); + String siteName = (String) data.get("siteName"); + String fileName = siteName + "防人为干扰检查表.docx"; + + // 2. 加载模板 + InputStream templateIs = this.getClass().getClassLoader() + .getResourceAsStream("human_template.docx"); + if (templateIs == null) { + throw new FileNotFoundException("模板未找到"); + } + + try (templateIs) { + // 3. 创建临时文件 → 填充模板 + File tempFile = File.createTempFile("temp", ".docx"); + // 告诉 JVM:当程序正常退出时(JVM 关闭),自动删除这个临时文件。 tempFile.deleteOnExit(); Files.copy(templateIs, tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING); @@ -385,7 +446,6 @@ public class SiteEvaluationInfoServiceImpl implements ISiteEvaluationInfoService }; } - @NotNull private static Map getData() { // 1. 准备数据(用户填写的内容) Map data = new LinkedHashMap<>(); @@ -522,6 +582,42 @@ public class SiteEvaluationInfoServiceImpl implements ISiteEvaluationInfoService return data; } + + private static Map getHumanData() { + // 1. 准备数据(用户填写的内容) + Map data = new LinkedHashMap<>(); + data.put("siteName", "临安区龙岗镇站"); + data.put("operationUnit", "安徽蓝盾光电子股份有限公司"); + // ✅ 自动生成当前时间,并格式化为 "yyyy-MM-dd HH:mm:ss" + String currentDateTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + data.put("checkDateTime", currentDateTime); + data.put("supervisor", "北京国研咨询"); + data.put("checkPeople", "李工"); + data.put("result", "无干扰"); + data.put("yes_1", "√"); + data.put("yes_2", "√"); + data.put("yes_3", "√"); + data.put("yes_4", "√"); + data.put("no_1", "√"); + data.put("no_2", "√"); + data.put("no_3", "√"); + data.put("no_4", "√"); + data.put("trouble_1", "存在问题"); + data.put("trouble_2", "存在问题"); + data.put("trouble_3", "存在问题"); + data.put("trouble_4", "存在问题"); + data.put("remark_1", "备注测试"); + data.put("remark_2", "备注测试"); + data.put("remark_3", "备注测试"); + data.put("remark_4", "备注测试"); + + System.out.println("✅ 数据准备完成!"); + System.out.println(JSONUtil.toJsonStr(data)); + JSONObject jsonObject = JSONUtil.parseObj(data); + System.out.println(jsonObject.toStringPretty()); + return data; + } + // 工具方法:计算相对误差,保留1位小数 private static String calcError(double mfcFlow, double stdFlow) { if (Math.abs(stdFlow) < 0.0001) return "0.0"; // 防止除0 diff --git a/ruoyi-modules/ruoyi-demo/src/main/resources/human_template.docx b/ruoyi-modules/ruoyi-demo/src/main/resources/human_template.docx new file mode 100644 index 0000000000000000000000000000000000000000..c6a4f0eda61807d02c59a52169d8af8923c35481 GIT binary patch literal 20044 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