You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Apache POI在MS Word(.docx)文档中嵌入文件?

如何用Apache POI在.docx中嵌入外部文件

没问题,Apache POI完全支持在.docx文档中嵌入外部文件,本质是通过创建OLE对象来实现的。下面是完整的可运行代码示例,包含依赖配置和核心逻辑:

1. 必要依赖(Maven)

首先确保你的项目中引入了Apache POI的相关依赖:

<dependencies>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>5.2.5</version> <!-- 使用最新稳定版本即可 -->
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-scratchpad</artifactId>
        <version>5.2.5</version>
    </dependency>
</dependencies>

2. 完整代码示例

import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.openxml4j.opc.PackageRelationship;
import org.apache.poi.openxml4j.opc.TargetMode;
import org.apache.poi.xwpf.usermodel.*;
import org.apache.poi.hwpf.usermodel.Ole2Embedder;
import org.apache.poi.util.IOUtils;

import java.io.*;

public class EmbedFileInDocx {
    public static void main(String[] args) throws IOException {
        // 1. 创建空白Word文档
        XWPFDocument doc = new XWPFDocument();
        XWPFParagraph paragraph = doc.createParagraph();
        XWPFRun run = paragraph.createRun();
        run.setText("嵌入的文件:");

        // 2. 准备要嵌入的目标文件(这里以本地的test.txt为例,可替换为其他类型文件)
        File embedFile = new File("test.txt");
        String embedFileName = embedFile.getName();
        byte[] fileBytes = IOUtils.toByteArray(new FileInputStream(embedFile));

        // 3. 创建OLE对象并嵌入到文档中
        // 生成嵌入文件的包关系
        PackagePart embedPart = doc.getPackage().createPart(
                "/word/embeddings/" + embedFileName,
                Ole2Embedder.getContentTypeForFile(embedFileName)
        );
        // 写入文件内容到包部分
        try (OutputStream os = embedPart.getOutputStream()) {
            os.write(fileBytes);
        }

        // 创建包关系关联OLE对象
        PackageRelationship rel = embedPart.addRelationship(
                "/word/embeddings/" + embedFileName,
                TargetMode.INTERNAL,
                "http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject"
        );

        // 创建CTOleObject并设置属性
        CTOleObject oleObject = CTOleObject.Factory.newInstance();
        oleObject.setId(rel.getId());
        oleObject.setType(STOleType.EMBED);
        oleObject.setProgId(Ole2Embedder.getProgIdForFile(embedFileName));
        oleObject.setShapeId("_x0000_i1025"); // 固定形状ID,可按需调整

        // 将OLE对象添加到段落中
        paragraph.getCTP().addNewOleObject().set(oleObject);

        // 4. 保存文档
        try (FileOutputStream out = new FileOutputStream("embedded_file.docx")) {
            doc.write(out);
        }

        // 关闭资源
        doc.close();
        System.out.println("文件嵌入完成,已保存为embedded_file.docx");
    }
}

关键说明

  • 代码支持嵌入多种类型的文件(如txt、pdf、excel等),Ole2Embedder会自动识别文件对应的ProgId和ContentType。
  • 嵌入的文件会被存储在docx包内部的/word/embeddings/目录下,不会依赖外部文件路径。
  • 如果需要嵌入Excel/Word等Office文件,ProgId会自动匹配,打开时直接调用对应程序编辑。

内容的提问来源于stack exchange,提问作者Renat Ahmetshin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 13:47:30