From 6aa4d08672249ae993743191d07387d01e09eda2 Mon Sep 17 00:00:00 2001 From: gjh <1421wake> Date: Thu, 4 Sep 2025 15:45:05 +0800 Subject: [PATCH] =?UTF-8?q?word=E6=A8=A1=E6=9D=BF=E5=AF=BC=E5=87=BAdemov6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/demo/domain/WordExportTest.java | 66 +++++++++++++++++- .../src/main/resources/score_template.docx | Bin 30373 -> 30534 bytes 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/WordExportTest.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/WordExportTest.java index 8d30d9f..340d5e7 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/WordExportTest.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/WordExportTest.java @@ -2,16 +2,30 @@ package org.dromara.demo.domain; import cn.afterturn.easypoi.word.WordExportUtil; import cn.hutool.json.JSONUtil; +import org.apache.poi.util.Units; +import org.apache.poi.xwpf.usermodel.ParagraphAlignment; import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.apache.poi.xwpf.usermodel.XWPFParagraph; +import org.apache.poi.xwpf.usermodel.XWPFRun; import org.jetbrains.annotations.NotNull; -import java.io.*; -import java.util.HashMap; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.InputStream; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; public class WordExportTest { + // ✅ 假设这是你要插入的图片路径列表(可以来自数据库、文件夹扫描等) + private static final List IMAGE_PATHS = List.of( + "D:\\Users\\14212\\Desktop\\故障图片.png", + "D:\\Users\\14212\\Desktop\\故障图片.png", + "D:\\Users\\14212\\Desktop\\故障图片.png" + // 可以是 0 个、1 个、N 个 + ); public static void main(String[] args) throws Exception { // 1. 准备数据(用户填写的内容) Map data = getData(); @@ -43,6 +57,10 @@ public class WordExportTest { // 4. ✅ 使用 EasyPOI 填充模板(传 File) XWPFDocument document = WordExportUtil.exportWord07(String.valueOf(tempFile), data); + // 5. ✅ 在文档末尾追加图片 + appendImages(document, IMAGE_PATHS); + + // 5. 导出到本地 String outputPath = "D:\\Users\\14212\\Desktop\\评分报告.docx"; // 可改为你的路径 try (FileOutputStream out = new FileOutputStream(outputPath)) { @@ -56,6 +74,50 @@ public class WordExportTest { System.out.println("✅ Word 文件已生成:" + outputPath); } + // ✅ 新增方法:追加图片到文档末尾 + private static void appendImages(XWPFDocument document, List imagePaths) throws Exception { + if (imagePaths == null || imagePaths.isEmpty()) { + System.out.println("📭 无图片需要插入"); + return; + } + + for (String imagePath : imagePaths) { + File imageFile = new File(imagePath); + if (!imageFile.exists()) { + System.err.println("⚠️ 图片未找到:" + imagePath); + continue; + } + + // 创建新段落 + XWPFParagraph paragraph = document.createParagraph(); + paragraph.setAlignment(ParagraphAlignment.CENTER); // 居中 + XWPFRun run = paragraph.createRun(); + + // 读取图片 + try (FileInputStream is = new FileInputStream(imageFile)) { + int pictureType = getPictureType(imageFile.getName()); + run.addPicture(is, pictureType, imageFile.getName(), + Units.toEMU(300), Units.toEMU(150)); + } + + + // 每张图后空一行 + document.createParagraph(); + } + } + + // ✅ 根据文件扩展名判断图片类型 + private static int getPictureType(String filename) { + String ext = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase(); + return switch (ext) { + case "png" -> XWPFDocument.PICTURE_TYPE_PNG; + case "jpg", "jpeg" -> XWPFDocument.PICTURE_TYPE_JPEG; + case "gif" -> XWPFDocument.PICTURE_TYPE_GIF; + case "bmp" -> XWPFDocument.PICTURE_TYPE_BMP; + default -> XWPFDocument.PICTURE_TYPE_JPEG; + }; + } + @NotNull private static Map getData() { // 1. 准备数据(用户填写的内容) diff --git a/ruoyi-modules/ruoyi-demo/src/main/resources/score_template.docx b/ruoyi-modules/ruoyi-demo/src/main/resources/score_template.docx index e1ddff0654c7b47abbeac4628c6ffc22c9f3ed3c..f9d32eefe61a7c82eea2f3385a9738418a773ab5 100644 GIT binary patch delta 6164 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 My3-(5x%{*FKXz@tlK=n! delta 5976 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