乐于分享
好东西不私藏

太强大了!Docx4j操作Word文档无所不能

太强大了!Docx4j操作Word文档无所不能

Spring Boot 3实战案例锦集PDF电子书已更新至130篇!
🎉🎉《Spring Boot实战案例合集》目前已更新227个案例,我们将持续不断的更新。文末有电子书目录。→ 现在就订阅合集

环境: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的使用。

2.实战案例
引入依赖
<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>
2.1 文本与样式
下面的案例我们创建了标题及一段文本:
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);
生成的word文档内容如下:

这里我们通过使用 WordprocessingMLPackage,该类代表OpenXML格式的docx文件,而 MainDocumentPart 类则存储主文档的document.xml表示形式。

为便于理解,我们通过压缩软件打开生成的word文档,打开其中的word/document.xml文件,查看其XML表示形式:

查看其中的document.xml

如我们所见,每句话都由段落(p)内的文本(t)构成,而addParagraphOfText()方法正是为此而存在。

addStyledParagraphOfText()则更进一步:它创建段落属性(pPr)来存储需应用于段落的样式。

2.2 更多文本段落样式控制

要创建美观的文档,我们需要完全掌控这些元素(段落、文本区块和文本)。因此,让我们探索如何通过 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对象,通过该对象设置了字体样式(加粗,斜体)。
2.3 添加图片
通过Docx4j能够非常简单的插入图片,如下示例:
// 添加图片File image = new File("d:/images/4.png" );byte[] fileContent = Files.readAllBytes(image.toPath());BinaryPartAbstractImage imagePart = BinaryPartAbstractImage  .createImagePart(wordPackage, fileContent);Inline inline = imagePart.createImageInline(  "她是寂寞的美女""美女"12false);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;}
生成结果如下:
2.4 生成表格
Docx4j 还使得操作表格(Tbl)、行(Tr)和列(Tc)变得相当简单。如下示例:
// 接着上面的内容int writableWidthTwips = wordPackage.getDocumentModel().getSections().get(0).getPageDimensions()    .getWritableWidthTwips();int columnNumber = 3;Tbl tbl = TblFactory.createTable(33, 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);
最终生成文档如下:
2.5 读取Docx内容
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 异步请求 + 虚拟线程性能提升?结果很意外

Spring Boot 动态生成签名 URL:私有文件安全访问方案

太燃了!Spring Boot 七种拦截技术,横扫各种问题

高级开发!玩转Controller接口,动态控制与实时刷新

完美!Spring Boot异常处理的8大终极方案,绝对天花板

技术专家:零代码,Spring Boot存储加密解密,支持JDBC、MyBatis及JPA

太强了!JavaParser:代码修改、生成与分析的全能利器

超赞!Java枚举的高级实战技巧

真强!使用JSON文件作为Spring Boot配置属性

Spring Boot 又一强大的内置功能,自动记录API请求/响应数据

Spring Boot 通过@JsonComponent注解完全控制JSON数据

高级开发!掌握 Spring Boot 内置 8 个核心事件,定制自定义逻辑,实现个性化配置