Java 使用 Apache POI 操作 Word 文档书签,解决 DOM Level 3 问题
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' 错误的方案。希望对你有所帮助!
原文地址: https://www.cveoy.top/t/topic/fLYR 著作权归作者所有。请勿转载和采集!