使用 Apache POI 5.2.2 替换 Word 文档书签内容

本文将介绍如何使用 Apache POI 5.2.2 替换 Word 文档中的书签内容。

假设你拥有三个 Word 文档:

  1. input01.docx:包含一个名为 '应变计' 的书签,其中包含相关数据。
  2. input02.docx:包含一个名为 '位移计' 的书签,其中包含相关数据。
  3. input03.docx:包含名为 '应变计' 和 '位移计' 的书签,但内容为空,需要用 input01.docxinput02.docx 的书签内容进行替换。

最终,你需要将替换后的内容保存到一个名为 input04.docx 的新文件中。

以下是用 Apache POI 5.2.2 实现该功能的 Java 代码示例:

import org.apache.poi.xwpf.usermodel.*;
import java.io.*;

public class WordBookmarkReplacement {
    public static void main(String[] args) {
        try {
            // 打开输入文件
            FileInputStream input01 = new FileInputStream("input01.docx");
            FileInputStream input02 = new FileInputStream("input02.docx");
            FileInputStream input03 = new FileInputStream("input03.docx");

            // 创建输入文件的文档对象
            XWPFDocument doc01 = new XWPFDocument(input01);
            XWPFDocument doc02 = new XWPFDocument(input02);
            XWPFDocument doc03 = new XWPFDocument(input03);

            // 获取输入文件的书签内容
            String bookmarkContent01 = getBookmarkContent(doc01, '应变计');
            String bookmarkContent02 = getBookmarkContent(doc02, '位移计');

            // 替换目标文件的书签内容
            replaceBookmarkContent(doc03, '应变计', bookmarkContent01);
            replaceBookmarkContent(doc03, '位移计', bookmarkContent02);

            // 关闭输入文件
            input01.close();
            input02.close();
            input03.close();

            // 保存新文件
            FileOutputStream output = new FileOutputStream("input04.docx");
            doc03.write(output);
            output.close();

            System.out.println("替换完成并保存为 input04.docx");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 获取书签内容
    public static String getBookmarkContent(XWPFDocument doc, String bookmarkName) {
        for (XWPFParagraph paragraph : doc.getParagraphs()) {
            for (XWPFRun run : paragraph.getRuns()) {
                for (CTBookmark bookmark : paragraph.getCTP().getBookmarkStartList()) {
                    if (bookmark.getName().equals(bookmarkName)) {
                        StringBuilder content = new StringBuilder();
                        while (run != null && !run.getCTR().isSetBookmarkEnd() &&
                                !bookmark.getId().equals(run.getCTR().getBookmarkStart().getId())) {
                            content.append(run.getText(0));
                            run = run.getNextSibling();
                        }
                        return content.toString();
                    }
                }
            }
        }
        return null;
    }

    // 替换书签内容
    public static void replaceBookmarkContent(XWPFDocument doc, String bookmarkName, String content) {
        for (XWPFParagraph paragraph : doc.getParagraphs()) {
            for (XWPFRun run : paragraph.getRuns()) {
                for (CTBookmark bookmark : paragraph.getCTP().getBookmarkStartList()) {
                    if (bookmark.getName().equals(bookmarkName)) {
                        while (run != null && !run.getCTR().isSetBookmarkEnd() &&
                                !bookmark.getId().equals(run.getCTR().getBookmarkStart().getId())) {
                            paragraph.removeRun(paragraph.getRuns().indexOf(run));
                            run = paragraph.getRuns().get(paragraph.getRuns().indexOf(run));
                        }
                        run.setText(content, 0);
                    }
                }
            }
        }
    }
}

请确保已将 Apache POI 的最新版本 5.2.2 添加到项目的依赖中。在代码中,首先打开输入文件,然后创建输入文件的文档对象。然后,通过 getBookmarkContent 方法获取输入文件的书签内容,并通过 replaceBookmarkContent 方法替换目标文件的书签内容。最后,保存新文件并关闭输入文件。

该代码示例展示了如何使用 Apache POI 5.2.2 替换 Word 文档中的书签内容,并提供了一个简单的应用场景。你可以根据自己的实际需求进行修改和扩展。


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

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