Java 使用 Apache POI 操作 Word 文档书签,解决 DOM Level 3 问题

本文将介绍如何使用 Apache POI 库在 Java 中操作 Word 文档书签,并提供解决 'DOM Level 3 Not implemented' 错误的方案。

代码示例

以下代码演示了如何使用 Apache POI 读取源 Word 文档中的书签内容,并将其复制到目标 Word 文档中对应书签的位置:javapackage word;

import org.apache.poi.xwpf.usermodel.XWPFDocument;import org.apache.poi.xwpf.usermodel.XWPFParagraph;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 { // 设置系统属性,指定使用支持DOM Level 3的XML解析器 System.setProperty('javax.xml.parsers.DocumentBuilderFactory', 'org.apache.xerces.jaxp.DocumentBuilderFactoryImpl');

        // 读取源文件            XWPFDocument sourceDoc = new XWPFDocument(new FileInputStream('input01.docx'));            // 读取目标文件            XWPFDocument targetDoc = new XWPFDocument(new FileInputStream('input03.docx'));

        // 获取源文件中的所有书签            for (XWPFParagraph paragraph : sourceDoc.getParagraphs()) {                for (CTBookmark bookmark : paragraph.getCTP().getBookmarkStartList()) {                    String bookmarkName = bookmark.getName();                    // 判断书签名称是否为应变计书签                    if (bookmarkName.equals('应变计')) {                        // 获取书签的文本内容                        String bookmarkText = paragraph.getText();

                    // 在目标文件中查找同名的书签                        for (XWPFParagraph targetParagraph : targetDoc.getParagraphs()) {                            for (CTBookmark targetBookmark : targetParagraph.getCTP().getBookmarkStartList()) {                                String targetBookmarkName = targetBookmark.getName();                                // 判断目标文件中的书签名称是否为应变计书签                                if (targetBookmarkName.equals('应变计')) {                                    // 替换目标文件中的书签内容                                    targetParagraph.getCTP().getBookmarkStartList().get(0).getDomNode().setTextContent(bookmarkText);                                    break;                                }                            }                        }                    }                }            }

        // 保存目标文件            FileOutputStream outputStream = new FileOutputStream('input04.docx');            targetDoc.write(outputStream);            outputStream.close();

        System.out.println('书签内容复制完成!');        } catch (IOException e) {            e.printStackTrace();        }    }}

解决 'DOM Level 3 Not implemented' 错误

在运行上述代码时,你可能会遇到以下错误:

Exception in thread 'main' org.apache.xmlbeans.impl.store.DomImpl$DomLevel3NotImplemented: DOM Level 3 Not implemented at org.apache.xmlbeans.impl.store.DomImpl._node_setTextContent(DomImpl.java:2197) at org.apache.xmlbeans.impl.store.NodeXobj.setTextContent(NodeXobj.java:179) at word.Word.main(Word.java:38)

这个错误是因为默认使用的 XML 解析器不支持 DOM Level 3 的方法 setTextContent 导致的。

解决办法:

在代码中,将以下代码:javaSystem.setProperty('javax.xml.parsers.DocumentBuilderFactory', 'com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl');

替换为:javaSystem.setProperty('javax.xml.parsers.DocumentBuilderFactory', 'org.apache.xerces.jaxp.DocumentBuilderFactoryImpl');

这行代码指定使用 Xerces XML 解析器,它支持 DOM Level 3。

修改后重新运行代码,问题应该就会解决。

总结

本文介绍了如何使用 Apache POI 操作 Word 文档书签,并提供了解决 'DOM Level 3 Not implemented' 错误的方案。希望对你有所帮助!

Java 使用 Apache POI 操作 Word 文档书签,解决 DOM Level 3 问题

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

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