Java 使用 Apache POI 操作 Word 文档书签:读取、替换与保存

本文介绍如何使用 Apache POI 库在 Java 中对 Word 文档的书签进行操作,包括读取书签内容、替换书签内容以及保存修改后的文档。

1. 准备工作

在开始之前,需要确保已经将 Apache POI 库添加到项目中。如果没有,可以通过 Maven 或 Gradle 等构建工具添加以下依赖:xml org.apache.poi poi 5.2.2 org.apache.poi poi-ooxml 5.2.2

2. 读取书签内容

以下代码示例演示了如何读取 Word 文档中指定书签的内容:javapackage word;

import org.apache.poi.xwpf.usermodel.XWPFDocument;import org.apache.poi.xwpf.usermodel.XWPFParagraph;import org.apache.poi.xwpf.usermodel.XWPFRun;import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBookmark;

import java.io.FileInputStream;import java.io.IOException;

public class Word {

private static String getBookmarkContent(XWPFDocument doc, String bookmarkName) {        for (XWPFParagraph paragraph : doc.getParagraphs()) {            for (XWPFRun run : paragraph.getRuns()) {                if (run != null) {                    for (CTBookmark bookmark : run.getCTR().getBookmarkStartList()) {                        if (bookmark.getName().equals(bookmarkName)) {                            return run.getText(0);                        }                    }                }            }        }        return null;    }

// ... 其他代码 ...}

代码解释:

  • getBookmarkContent 方法接收一个 XWPFDocument 对象(表示 Word 文档)和一个字符串类型的 bookmarkName 参数(表示要读取的书签名称)。- 遍历文档中的所有段落和所有 Run,通过 run.getCTR().getBookmarkStartList() 获取 Run 中的书签列表。- 遍历书签列表,找到与目标书签名称匹配的书签,并使用 run.getText(0) 获取书签的内容。- 如果没有找到目标书签,则返回 null

3. 替换书签内容

以下代码示例演示了如何替换 Word 文档中指定书签的内容:javapackage word;

import org.apache.poi.xwpf.usermodel.XWPFDocument;import org.apache.poi.xwpf.usermodel.XWPFParagraph;import org.apache.poi.xwpf.usermodel.XWPFRun;import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBookmark;

import java.io.FileOutputStream;import java.io.IOException;

public class Word {

private static void replaceBookmarkContent(XWPFDocument doc, String bookmarkName, String content) {        for (XWPFParagraph paragraph : doc.getParagraphs()) {            for (XWPFRun run : paragraph.getRuns()) {                if (run != null) {                    for (CTBookmark bookmark : run.getCTR().getBookmarkStartList()) {                        if (bookmark.getName().equals(bookmarkName)) {                            run.setText(content, 0);                        }                    }                }            }        }    }

// ... 其他代码 ...}

代码解释:

  • replaceBookmarkContent 方法接收一个 XWPFDocument 对象、一个字符串类型的 bookmarkName 参数以及一个字符串类型的 content 参数(表示要替换成的内容)。- 遍历文档中的所有段落和所有 Run,找到与目标书签名称匹配的书签。- 使用 run.setText(content, 0) 将书签的内容替换为指定内容。

4. 保存修改后的文档

完成书签内容的读取或替换后,可以使用以下代码将修改后的文档保存到文件中:javapackage word;

import org.apache.poi.xwpf.usermodel.XWPFDocument;

import java.io.FileOutputStream;import java.io.IOException;

public class Word {

public static void main(String[] args) {        try {            // 读取输入文件            XWPFDocument input01Doc = new XWPFDocument(new FileInputStream('input01.docx'));            XWPFDocument input02Doc = new XWPFDocument(new FileInputStream('input02.docx'));            XWPFDocument input03Doc = new XWPFDocument(new FileInputStream('input03.docx'));

        // 获取输入文件的书签内容            String bookmark01Content = getBookmarkContent(input01Doc, '应变计');            String bookmark02Content = getBookmarkContent(input02Doc, '位移计');

        // 替换输入文件的书签内容            replaceBookmarkContent(input03Doc, '应变计', bookmark01Content);            replaceBookmarkContent(input03Doc, '位移计', bookmark02Content);

        // 保存新文件            FileOutputStream outputDoc = new FileOutputStream('input04.docx');            input03Doc.write(outputDoc);            outputDoc.close();

        System.out.println('替换完成!');        } catch (IOException e) {            e.printStackTrace();        }    }

// ... 其他代码 ...}

代码解释:

  • 创建一个 FileOutputStream 对象,指定要保存的文件路径。- 调用 XWPFDocument 对象的 write() 方法,将文档内容写入文件输出流。- 关闭文件输出流。

5. 完整代码示例javapackage word;

import org.apache.poi.xwpf.usermodel.XWPFDocument;import org.apache.poi.xwpf.usermodel.XWPFParagraph;import org.apache.poi.xwpf.usermodel.XWPFRun;import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBookmark;

import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;

public class Word { public static void main(String[] args) { try { // 读取输入文件 XWPFDocument input01Doc = new XWPFDocument(new FileInputStream('input01.docx')); XWPFDocument input02Doc = new XWPFDocument(new FileInputStream('input02.docx')); XWPFDocument input03Doc = new XWPFDocument(new FileInputStream('input03.docx'));

        // 获取输入文件的书签内容            String bookmark01Content = getBookmarkContent(input01Doc, '应变计');            String bookmark02Content = getBookmarkContent(input02Doc, '位移计');

        // 替换输入文件的书签内容            replaceBookmarkContent(input03Doc, '应变计', bookmark01Content);            replaceBookmarkContent(input03Doc, '位移计', bookmark02Content);

        // 保存新文件            FileOutputStream outputDoc = new FileOutputStream('input04.docx');            input03Doc.write(outputDoc);            outputDoc.close();

        System.out.println('替换完成!');        } catch (IOException e) {            e.printStackTrace();        }    }

private static String getBookmarkContent(XWPFDocument doc, String bookmarkName) {        for (XWPFParagraph paragraph : doc.getParagraphs()) {            for (XWPFRun run : paragraph.getRuns()) {                if (run != null) {                    for (CTBookmark bookmark : run.getCTR().getBookmarkStartList()) {                        if (bookmark.getName().equals(bookmarkName)) {                            return run.getText(0);                        }                    }                }            }        }        return null;    }

private static void replaceBookmarkContent(XWPFDocument doc, String bookmarkName, String content) {        for (XWPFParagraph paragraph : doc.getParagraphs()) {            for (XWPFRun run : paragraph.getRuns()) {                if (run != null) {                    for (CTBookmark bookmark : run.getCTR().getBookmarkStartList()) {                        if (bookmark.getName().equals(bookmarkName)) {                            run.setText(content, 0);                        }                    }                }            }        }    }}

总结

本文介绍了如何使用 Apache POI 库在 Java 中读取、替换和保存 Word 文档书签。通过使用这些方法,可以轻松地操作 Word 文档中的书签,实现自动化文档处理等功能。

Java 使用 Apache POI 操作 Word 文档书签:读取、替换与保存

原文地址: https://www.cveoy.top/t/topic/fMcf 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录