太强大了!Docx4j操作Word文档无所不能
环境:Spring Boot 3.5.0
1. 简介
Docx4j是基于Java的开源库,专为处理Microsoft Office Open XML格式(如.docx、.xlsx、.pptx)设计。其核心功能包括:
-
打开现有的 docx/pptx/xlsx 文件
-
创建新的 docx/pptx/xlsx 文件
-
以编程方式操作 docx/pptx/xlsx(支持文件格式允许的任何操作)
-
通过变量、内容控件数据绑定或 MERGEFIELD 生成文档
-
自定义 XML 绑定(支持图片、富文本、复选框,以及 OpenDoPE 扩展的重复和条件功能,还支持导入 XHTML)
-
导出为 HTML
-
导出为 PDF(有三种策略可供选择,详见 https://www.docx4java.org/blog/2020/09/office-pptxxlsxdocx-to-pdf-to-in-docx4j-8-2-3/)
-
生成/使用 Word 2007 的 xmlPackage(pkg)格式
-
应用转换,包括常用过滤器
-
字体支持(字体替换,以及使用文档中嵌入的任何字体)
本篇文章我们将详细的介绍Docx4j的使用。
<dependency><groupId>org.docx4j</groupId><artifactId>docx4j-core</artifactId><version>11.5.8</version></dependency><dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>4.0.6</version></dependency><dependency><groupId>org.docx4j</groupId><artifactId>docx4j-JAXB-ReferenceImpl</artifactId><version>11.5.8</version></dependency>
WordprocessingMLPackage wordPackage = WordprocessingMLPackage.createPackage();MainDocumentPart mainDocumentPart = wordPackage.getMainDocumentPart();mainDocumentPart.addStyledParagraphOfText("Title", "Spring Boot3实战案例200讲");mainDocumentPart.addParagraphOfText("《Spring Boot3实战案例200讲》涵盖从基础环境搭建到高级特性应用,如响应式编程、集群限流、自定义Starter封装等,助力开发者快速掌握Spring Boot3核心技能,提升实战能力。");File exportFile = new File("d:/Spring Boot3实战案例200讲.docx");wordPackage.save(exportFile);

这里我们通过使用 WordprocessingMLPackage,该类代表OpenXML格式的docx文件,而 MainDocumentPart 类则存储主文档的document.xml表示形式。
为便于理解,我们通过压缩软件打开生成的word文档,打开其中的word/document.xml文件,查看其XML表示形式:


如我们所见,每句话都由段落(p)内的文本(t)构成,而addParagraphOfText()方法正是为此而存在。
addStyledParagraphOfText()则更进一步:它创建段落属性(pPr)来存储需应用于段落的样式。
要创建美观的文档,我们需要完全掌控这些元素(段落、文本区块和文本)。因此,让我们探索如何通过 runProperties(RPr)对象为内容添加样式:
WordprocessingMLPackage wordPackage = WordprocessingMLPackage.createPackage();MainDocumentPart mainDocumentPart = wordPackage.getMainDocumentPart();mainDocumentPart.addStyledParagraphOfText("Title", "Spring Boot3实战案例200讲");mainDocumentPart.addParagraphOfText("《Spring Boot3实战案例200讲》涵盖从基础环境搭建到高级特性应用,如响应式编程、集群限流、自定义Starter封装等,助力开发者快速掌握Spring Boot3核心技能,提升实战能力。");ObjectFactory factory = Context.getWmlObjectFactory();P p = factory.createP();R r = factory.createR();Text t = factory.createText();t.setValue("作者:Pack_xg");r.getContent().add(t);p.getContent().add(r);RPr rpr = factory.createRPr();BooleanDefaultTrue b = new BooleanDefaultTrue();rpr.setB(b);rpr.setI(b);Color green = factory.createColor();green.setVal("green");rpr.setColor(green);r.setRPr(rpr);mainDocumentPart.getContent().add(p);File exportFile = new File("d:/Spring Boot3实战案例200讲.docx");wordPackage.save(exportFile);

-
createP:创建段落 -
createR:创建文本区块 -
createText:创建文本元素 -
createRPr:通过该方法创建RPr对象,通过该对象设置了字体样式(加粗,斜体)。
// 添加图片File image = new File("d:/images/4.png" );byte[] fileContent = Files.readAllBytes(image.toPath());BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordPackage, fileContent);Inline inline = imagePart.createImageInline("她是寂寞的美女", "美女", 1, 2, false);P Imageparagraph = addImageToParagraph(inline);mainDocumentPart.getContent().add(Imageparagraph);private static P addImageToParagraph(Inline inline) {ObjectFactory factory = new ObjectFactory();P p = factory.createP();R r = factory.createR();p.getContent().add(r);Drawing drawing = factory.createDrawing();r.getContent().add(drawing);drawing.getAnchorOrInline().add(inline);return p;}

// 接着上面的内容int writableWidthTwips = wordPackage.getDocumentModel().getSections().get(0).getPageDimensions().getWritableWidthTwips();int columnNumber = 3;Tbl tbl = TblFactory.createTable(3, 3, writableWidthTwips / columnNumber);List<Object> rows = tbl.getContent();for (int i = 0; i < rows.size(); i++) {Object row = rows.get(i);Tr tr = (Tr) row;List<Object> cells = tr.getContent();for (int j = 0; j < cells.size(); j++) {Object cell = cells.get(j);Tc td = (Tc) cell;P p1 = factory.createP();R r1 = factory.createR();Text t1 = factory.createText();t1.setValue("作者:Pack_xg - %s - %s".formatted(i, j));r1.getContent().add(t1);p1.getContent().add(r1);td.getContent().add(p1);}}mainDocumentPart.getContent().add(tbl);

public static void read() throws Exception {File doc = new File("d:/Spring Boot3实战案例200讲.docx");WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(doc);MainDocumentPart mainDocumentPart = wordMLPackage.getMainDocumentPart();String textNodesXPath = "//w:t";List<Object> textNodes = mainDocumentPart.getJAXBNodesViaXPath(textNodesXPath, true);for (Object obj : textNodes) {Text text = (Text) ((JAXBElement) obj).getValue();String textValue = text.getValue();System.out.println(textValue);}}

Spring Boot 动态生成签名 URL:私有文件安全访问方案
完美!Spring Boot异常处理的8大终极方案,绝对天花板
技术专家:零代码,Spring Boot存储加密解密,支持JDBC、MyBatis及JPA
太强了!JavaParser:代码修改、生成与分析的全能利器
Spring Boot 又一强大的内置功能,自动记录API请求/响应数据
Spring Boot 通过@JsonComponent注解完全控制JSON数据
高级开发!掌握 Spring Boot 内置 8 个核心事件,定制自定义逻辑,实现个性化配置










夜雨聆风