杰瑞科技汇

java 导出图片到word

下面我将为您提供几种最常用的场景,并附上详细的代码示例。

准备工作:添加 Apache POI 依赖

您需要在您的项目中添加 Apache POI 的依赖,如果您使用 Maven,请在 pom.xml 文件中添加以下内容:

<dependencies>
    <!-- 核心 POI 库,用于处理 .docx 文件 -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>5.2.4</version>
    </dependency>
    <!-- 用于处理 .docx 文件的 OOXML 库 -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>5.2.4</version>
    </dependency>
    <!-- 用于处理 XWPF 相关的样式和布局 -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-scratchpad</artifactId>
        <version>5.2.4</version>
    </dependency>
</dependencies>

在 Word 文档的指定位置插入一张图片

这是最基础的需求,我们将创建一个 Word 文档,并在其中插入一张图片。

步骤:

  1. 创建 XWPFDocument 对象,代表一个空的 Word 文档。
  2. 创建一个 XWPFParagraph 段落和一个 XWPFRun 运行对象(Run 是段落中具有相同格式的一串文本)。
  3. 使用 XWPFRun.addPicture() 方法将图片添加到 Run 中。
  4. 设置图片的宽度、高度和类型。
  5. XWPFDocument 写入到 .docx 文件中。

代码示例:

import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.*;
import java.io.FileOutputStream;
import java.io.IOException;
public class InsertImageToWord {
    public static void main(String[] args) {
        // 1. 创建一个空的 Word 文档对象
        XWPFDocument document = new XWPFDocument();
        // 2. 创建一个段落
        XWPFParagraph paragraph = document.createParagraph();
        XWPFRun run = paragraph.createRun();
        // 3. 在段落中添加文本
        run.setText("这是一张测试图片:");
        try {
            // 4. 读取图片文件
            // 请确保你的项目路径下有 "logo.png" 这张图片
            // 或者使用绝对路径,"C:/Users/YourUser/Desktop/logo.png"
            String imagePath = "logo.png"; 
            java.io.FileInputStream inputStream = new java.io.FileInputStream(imagePath);
            // 5. 将图片添加到 Run 中
            // 参数说明:
            // - inputStream: 图片输入流
            // - pictureType: 图片格式 (如 PNG, JPEG)
            // - width: 图片宽度 (单位:EMU - English Metric Unit, 1英寸 = 1440 EMU)
            // - height: 图片高度 (单位:EMU)
            run.addPicture(inputStream, XWPFDocument.PICTURE_TYPE_PNG, "logo.png", Units.toEMU(200), Units.toEMU(150));
            // 6. 关闭图片输入流
            inputStream.close();
            // 7. 在图片后添加更多文本
            run.setText("\n图片已成功插入!");
            // 8. 将文档写入到 .docx 文件
            try (FileOutputStream out = new FileOutputStream("InsertImageResult.docx")) {
                document.write(out);
                System.out.println("Word 文档生成成功,文件名为: InsertImageResult.docx");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                document.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

在表格的单元格中插入图片

在 Word 表格中插入图片也很常见,例如在报表中展示图表或产品图片。

步骤:

  1. 创建 XWPFDocumentXWPFTable
  2. 创建 XWPFTableRowXWPFTableCell
  3. 获取单元格中的段落 (XWPFParagraph) 和运行 (XWPFRun)。
  4. 与场景一类似,使用 run.addPicture() 方法添加图片。

代码示例:

import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.*;
import java.io.FileOutputStream;
import java.io.IOException;
public class InsertImageToTable {
    public static void main(String[] args) {
        XWPFDocument document = new XWPFDocument();
        // 1. 创建一个表格,1行2列
        XWPFTable table = document.createTable(1, 2);
        XWPFTableRow row = table.getRow(0);
        // 2. 设置第一列的宽度 (可选)
        row.getCell(0).getCTTc().addNewTcPr().addNewTcW().setW(Units.toEMU(2000));
        // 3. 在第一列的单元格中插入图片
        XWPFTableCell cell1 = row.getCell(0);
        XWPFParagraph paragraph1 = cell1.addParagraph();
        XWPFRun run1 = paragraph1.createRun();
        run1.setText("这是第一张图片");
        try (java.io.FileInputStream is1 = new java.io.FileInputStream("logo.png")) {
            run1.addPicture(is1, XWPFDocument.PICTURE_TYPE_PNG, "logo1.png", Units.toEMU(180), Units.toEMU(130));
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 4. 在第二列的单元格中插入图片
        XWPFTableCell cell2 = row.getCell(1);
        XWPFParagraph paragraph2 = cell2.addParagraph();
        XWPFRun run2 = paragraph2.createRun();
        run2.setText("这是第二张图片");
        try (java.io.FileInputStream is2 = new java.io.FileInputStream("logo.png")) {
            run2.addPicture(is2, XWPFDocument.PICTURE_TYPE_PNG, "logo2.png", Units.toEMU(180), Units.toEMU(130));
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 5. 保存文档
        try (FileOutputStream out = new FileOutputStream("InsertImageToTableResult.docx")) {
            document.write(out);
            System.out.println("带图片的表格 Word 文档生成成功,文件名为: InsertImageToTableResult.docx");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                document.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

在页眉或页脚中插入图片

有时需要在页眉或页脚添加公司 Logo。

步骤:

  1. 获取文档的 XWPFHeaderFooter 对象。
  2. 从页眉/页脚中获取或创建一个段落。
  3. 在段落中获取或创建一个 Run
  4. 使用 run.addPicture() 方法添加图片。

代码示例:

import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.*;
import java.io.FileOutputStream;
import java.io.IOException;
public class InsertImageToHeader {
    public static void main(String[] args) {
        XWPFDocument document = new XWPFDocument();
        // 1. 获取页眉
        XWPFHeader header = document.createHeader(HeaderFooterType.DEFAULT);
        // 2. 在页眉中创建一个段落,并右对齐
        XWPFParagraph paragraph = header.createParagraph();
        paragraph.setAlignment(ParagraphAlignment.RIGHT);
        XWPFRun run = paragraph.createRun();
        // 3. 在页眉中添加图片
        try (java.io.FileInputStream is = new java.io.FileInputStream("logo.png")) {
            run.addPicture(is, XWPFDocument.PICTURE_TYPE_PNG, "header_logo.png", Units.toEMU(100), Units.toEMU(50));
            run.setText("  "); // 添加一些空格,使图片和文本分开
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 4. 在文档主体中添加一些内容
        XWPFParagraph bodyParagraph = document.createParagraph();
        bodyParagraph.createRun().setText("这是文档的主体内容,页眉中已经添加了图片。");
        // 5. 保存文档
        try (FileOutputStream out = new FileOutputStream("InsertImageToHeaderResult.docx")) {
            document.write(out);
            System.out.println("带页眉图片的 Word 文档生成成功,文件名为: InsertImageToHeaderResult.docx");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                document.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

重要提示和注意事项

  1. 图片类型addPicture 方法的第二个参数 pictureType 必须与图片的实际格式匹配,常用的有:

    • XWPFDocument.PICTURE_TYPE_PNG (对应 .png)
    • XWPFDocument.PICTURE_TYPE_JPEG (对应 .jpg, .jpeg)
    • XWPFDocument.PICTURE_TYPE_EMF (对应 .emf)
    • XWPFDocument.PICTURE_TYPE_WMF (对应 .wmf)
    • XWPFDocument.PICTURE_TYPE_DIB (对应 .dib)
  2. 尺寸单位:图片的宽度和高度使用 Units.toEMU() 方法进行转换。EMU (English Metric Unit) 是 POI 内部使用的单位,1英寸 = 1440 EMU,如果你习惯使用像素,可以自己转换,widthInPixels * 1440 / 96(假设 DPI 为 96)。

  3. .doc vs .docx

    • Apache POI 不能 直接操作旧版的 .doc 文件。.doc 是二进制格式,处理起来非常复杂。
    • POI 专门用于处理 .docx 格式,这是基于 XML 的,易于读写和操作。
    • 如果必须处理 .doc 文件,可以考虑使用 Jacob 或其他库,但通常建议直接生成 .docx,因为现在绝大多数软件都兼容。
  4. 资源管理:代码中使用了 try-with-resources 语句(try (FileOutputStream out = ...))来确保文件流和文档对象在使用后被正确关闭,防止资源泄漏,这是一个非常好的编程习惯。

  5. 复杂布局:对于复杂的 Word 布局(如文本环绕图片、图文混排等),使用纯 POI 会变得非常困难和繁琐,在这种情况下,可以考虑使用更高级的库,如 docx4jAspose.Words,它们提供了更强大的 API 来精确控制 Word 文档的样式和布局,但通常是商业软件(有免费试用版)。

希望这些示例和说明能帮助您成功地在 Java 中实现图片导出到 Word 的功能!

分享:
扫描分享到社交APP
上一篇
下一篇