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

本文介绍了使用 Apache POI 库替换 Word 文档书签内容的方法。

代码示例

package 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;

public class Word {
    public static void main(String[] args) {
        try {
            // 打开输入文件input01.docx和input03.docx
            FileInputStream input01 = new FileInputStream('input01.docx');
            FileInputStream input03 = new FileInputStream('input03.docx');
            XWPFDocument doc01 = new XWPFDocument(input01);
            XWPFDocument doc03 = new XWPFDocument(input03);

            // 获取input01.docx中应变计书签的内容
            String bookmarkContent = getBookmarkContent(doc01, '应变计');

            // 替换input03.docx中应变计书签的内容
            replaceBookmarkContent(doc03, '应变计', bookmarkContent);

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

            // 关闭文档
            doc01.close();
            doc03.close();

            System.out.println('替换成功!');
        } 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 : run.getCTR().getBookmarkStartArray()) {
                    if (bookmark.getName().equals(bookmarkName)) {
                        return run.getText(0);
                    }
                }
            }
        }
        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 : run.getCTR().getBookmarkStartArray()) {
                    if (bookmark.getName().equals(bookmarkName)) {
                        run.setText(content, 0);
                    }
                }
            }
        }
    }
}

Apache POI 版本 5.2.2 的解决办法

在 Apache POI 版本 5.2.2 中,getBookmarkStartList() 方法已被移除。相反,你可以使用 getBookmarkStartArray() 方法来获取书签的起始位置。以下是修改后的代码:

// 获取书签的内容
public static String getBookmarkContent(XWPFDocument doc, String bookmarkName) {
    for (XWPFParagraph paragraph : doc.getParagraphs()) {
        for (XWPFRun run : paragraph.getRuns()) {
            for (CTBookmark bookmark : run.getCTR().getBookmarkStartArray()) {
                if (bookmark.getName().equals(bookmarkName)) {
                    return run.getText(0);
                }
            }
        }
    }
    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 : run.getCTR().getBookmarkStartArray()) {
                if (bookmark.getName().equals(bookmarkName)) {
                    run.setText(content, 0);
                }
            }
        }
    }
}

请注意,此代码假设书签只会出现在段落的运行中。如果你的书签出现在其他部分(如表格、页眉或页脚)中,你需要相应地调整代码以处理这些情况。

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

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

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