如何使用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
相关产品推荐
相关产品推荐

