Java操作.docx文档 —— docx4j

一、导入Maven

第一步:创建个用Maven构建的项目
第二步:找到配置文件pom.xml并打开
第三步:导入docx4j项目

复制下面代码到<dependencies> ... <dependencies>

XML 复制代码
        <dependency>
            <groupId>org.docx4j</groupId>
            <artifactId>docx4j</artifactId>
            <version>6.1.2</version>
        </dependency>

        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.1</version>
        </dependency>
第四步:打开右侧的Maven,重新加载项目,如果加载失败多试几遍(网络问题)

二、docx4j 的用法

(1)WordprocessingMLPackage类:

红色部分为常用函数

  • createPackage(): 创建一个全新的、空白的 Word 文档对象
  • load(File file) / load(InputStream is): 从硬盘或网络流中加载一个已有的 .docx 文件
  • save(File file): 最直接的保存方式,直接保存到指定文件
  • toOutputStream(OutputStream os): 将文档内容写入一个输出流
  • getDocumentModel(): 获取整个文档的模型对象
  • getParts(): 获取文档中所有的部件列表
  • getDocPropsCorePart() / getDocPropsExtendedPart(): 获取核心文档属性和扩展属性,可以用来设置作者、标题、主题、关键词等
  • getDocumentSettingsPart(): 获取文档设置部分,可以控制一些 Word 的行为,比如是否显示语法错误、是否自动更新域等
  • addTargetPart(Part part): 这是一个强大的方法,允许你向文档中添加自定义部件。
  • getMainDocumentPart(): 返回的是 MainDocumentPart 对象,文档的正文部分。所有的段落、表格、图片等,最终都是添加到这个 MainDocumentPart 里的。

(2)MainDocumentPart 类

  • getContent(): 获取内容列表,返回一个 List<Object>
  • addObject(Object o): getContent().add(o) 的简化版
  • addParagraphOfText(String text): 直接添加一个只包含纯文本的段落
  • addTableOfContents(String tocCaption, String headingStyleId, int maxLevel, int minLevel, String rightAlignTabStop, String instructionalText): 添加目录。这个方法参数较多,但功能强大。通常在报告的开头使用。
  • addStyledParagraphOfText(String styleId, String text): 非常有用的快捷方法。添加一个应用了预设样式的段落。
  • getContent().iterator(): 遍历所有内容,最基础的查找方式。比如文章要把"张三"替换成"李四",那么就需要这个。

(3)VariablePrepare类

VariablePrepare 是一个工具类(Utility Class),你不需要去 new 一个它的实例!!!

  • prepare():它会遍历 MainDocumentPart 下的所有文本节点,会寻找符合特定模式的文本。默认情况下,它识别的是 ${variable_name} 这种格式。这里的 variable_name 可以是字母、数字、下划线的组合。一旦找到匹配的文本,会将这段纯文本字符串转换成一个 Word 原生的"域"结构

  • findAndReplaceVariables(List<Object> paragraphs): 这是一个典型的内部工作函数。它的作用是接收一个包含段落或表格单元格的列表,然后遍历这个列表,对每一个元素调用更底层的查找和替换逻辑。

  • findAndReplaceInP(P p) : 专门用于处理单个段落 (P) 的方法。它会深入到段落内部的文本运行 (R) 和文本 (Text) 对象中去寻找占位符。


三、实战代码:

1,生成一个空白文档:

代码:

java 复制代码
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import java.io.File;

public class Sample {
    public static void main(String[] args) throws Exception {
        //获取实例
        WordprocessingMLPackage wordprocessingMLPackage = WordprocessingMLPackage.createPackage();
        //将文件保存为D:\sample\sample.docx
        wordprocessingMLPackage.save(new File("D:\\sample\\sample.docx"));
    }
}

成果演示:


2,生成一个文章

演示版本:

java 复制代码
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
import org.docx4j.wml.*;

import java.io.File;

public class Sample {
    public static void main(String[] args) throws Exception {
        //获取实例
        WordprocessingMLPackage wordprocessingMLPackage = WordprocessingMLPackage.createPackage();

        //文章标题与内容
        String title = "标题";
        String content = "文章内容文章内容文章内容文章内容文章内容文章内容文章内容文章内容文章内容文章内容文章内容文章内容文章内容文章内容文章内容";

        //获取MainDocumentPart实例
        MainDocumentPart mainPart = wordprocessingMLPackage.getMainDocumentPart();

        //获取factory实例
        ObjectFactory objectFactory = new ObjectFactory();

        //创建P(paragraph)实例
        P p_title = objectFactory.createP();
        P p_content = objectFactory.createP();
        //创建PPr(Paragraph Properties)实例(方便设置文字格式)
        PPr pPr_title = objectFactory.createPPr();
        PPr pPr_content =objectFactory.createPPr();
        //创建 PStyle 对象
        PPrBase.PStyle style_title = objectFactory.createPPrBasePStyle();
        PPrBase.PStyle style_content = objectFactory.createPPrBasePStyle();
        //为 style 设置值
        style_title.setVal("Title");
        //为PPr对象设置格式(Style)
        pPr_title.setPStyle(style_title);
        //创建R(Run)和Text对象
        R run_title = objectFactory.createR();
        R run_content = objectFactory.createR();
        Text text_title = objectFactory.createText();
        Text text_content = objectFactory.createText();
        //设置文本的值
        text_title.setValue(title);
        text_content.setValue(content);
        //将Text对象添加到Run(R)的内容中
        run_title.getContent().add(text_title);
        run_content.getContent().add(text_content);
        //往P对象中添加R对象
        p_title.getContent().add(run_title);
        p_content.getContent().add(run_content);
        //在P对象中设置PPr对象
        p_title.setPPr(pPr_title);
        p_content.setPPr(pPr_content);

        //添加P元素进文件
        mainPart.getContent().add(p_title);
        mainPart.getContent().add(p_content);

        //将文件保存为D:\sample\sample2.docx
        wordprocessingMLPackage.save(new File("D:\\sample\\sample2.docx"));
    }
}

简化版本:

java 复制代码
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
import org.docx4j.wml.*;

import java.io.File;

public class Sample {
    public static void main(String[] args) throws Exception {
        WordprocessingMLPackage wordprocessingMLPackage = WordprocessingMLPackage.createPackage();
        String title = "标题";
        String content = "文章内容文章内容文章内容文章内容文章内容文章内容文章内容文章内容文章内容文章内容文章内容文章内容文章内容文章内容文章内容";
        MainDocumentPart mainPart = wordprocessingMLPackage.getMainDocumentPart();
        mainPart = simplify(mainPart , "Title" , title );
        mainPart = simplify(mainPart, "Normal" , content);
        wordprocessingMLPackage.save(new File("D:\\sample\\sample2.docx"));
    }
    public static MainDocumentPart simplify( MainDocumentPart mainDocumentPart , String str_style , String str_text ){
        ObjectFactory objectFactory = new ObjectFactory();
        P p = objectFactory.createP();
        PPr pPr = objectFactory.createPPr();
        PPrBase.PStyle style = objectFactory.createPPrBasePStyle();
        style.setVal(str_style);
        pPr.setPStyle(style);
        R run = objectFactory.createR();
        Text text = objectFactory.createText();
        text.setValue(str_text);
        run.getContent().add(text);
        p.getContent().add(run);
        p.setPPr(pPr);
        mainDocumentPart.getContent().add(p);
        return mainDocumentPart;
    }
}

成果演示:


3,添加图片

代码:

java 复制代码
import org.docx4j.dml.wordprocessingDrawing.Inline;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage;
import org.docx4j.wml.*;

import java.io.File;

public class Sample {
    public static void main(String[] args) throws Exception {
        WordprocessingMLPackage wordprocessingMLPackage = WordprocessingMLPackage.createPackage();
        wordprocessingMLPackage = addPhotoIntoDocx(wordprocessingMLPackage , new File( "D:\\sample\\sample.png" ));
        wordprocessingMLPackage.save(new File("D:\\sample\\sample3.docx"));
    }
    public static WordprocessingMLPackage addPhotoIntoDocx(WordprocessingMLPackage wordPackage , File imgFile) throws Exception {
            BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordPackage, imgFile);
            Inline inline = imagePart.createImageInline("Auto-sized Image", "Alt Text", 0, 0, 10000);
            ObjectFactory factory = new ObjectFactory();
            org.docx4j.wml.Drawing drawing = factory.createDrawing();
            drawing.getAnchorOrInline().add(inline);
            org.docx4j.wml.P paragraph = factory.createP();
            org.docx4j.wml.R run = factory.createR();
            run.getContent().add(drawing);
            paragraph.getContent().add(run);
            wordPackage.getMainDocumentPart().addObject(paragraph);
        return wordPackage;
    }
}

成果演示:

相关推荐
小龙报3 小时前
《彻底理解C语言指针全攻略(3)》
c语言·开发语言·windows·git·创业创新·学习方法·visual studio
hello 早上好3 小时前
深入 Spring 条件化配置底层:从硬编码到通用注解的实现原理
java·后端·spring
亚林瓜子3 小时前
Spring中Date日期序列化与反序列化中格式设置
java·后端·spring·jackson·date
GISer_Jing3 小时前
Next.js数据获取演进史
java·开发语言·javascript
棉猴4 小时前
GESP C++等级认证三级15-原码反码补码2-2
开发语言·c++·gesp·c++三级·等级认证·原码反码补码
DokiDoki之父4 小时前
Web核心—JSP入门/EL/JSTL标签/MVC+三层架构/一文速通
java·开发语言
寒月霜华4 小时前
java-高级技术(单元测试、反射)
java·开发语言·单元测试·反射
独自破碎E4 小时前
Leetcode2166-设计位集
java·数据结构·算法
Cikiss4 小时前
LeetCode160.相交链表【最通俗易懂版双指针】
java·数据结构·算法·链表